summaryrefslogtreecommitdiff
path: root/sds.c
diff options
context:
space:
mode:
authorPieter Noordhuis <pcnoordhuis@gmail.com>2011-04-21 18:37:43 +0200
committerPieter Noordhuis <pcnoordhuis@gmail.com>2011-04-21 18:37:43 +0200
commitac9fb4993bfbc37477c772db9c7ae934012c8e85 (patch)
tree0dd3aaddd9e794e10e6450a9da6e4507bb0ff3aa /sds.c
parent75bc8595c72fba7bd77ac99249d49d3ade1ef7fd (diff)
Don't abort on OOM in sds.c
Diffstat (limited to 'sds.c')
-rw-r--r--sds.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/sds.c b/sds.c
index 2bd5a81..02fb443 100644
--- a/sds.c
+++ b/sds.c
@@ -28,18 +28,18 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-#define SDS_ABORT_ON_OOM
-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "sds.h"
+#ifdef SDS_ABORT_ON_OOM
static void sdsOomAbort(void) {
fprintf(stderr,"SDS: Out Of Memory (SDS_ABORT_ON_OOM defined)\n");
abort();
}
+#endif
sds sdsnewlen(const void *init, size_t initlen) {
struct sdshdr *sh;
@@ -378,6 +378,8 @@ sds sdsfromlonglong(long long value) {
sds sdscatrepr(sds s, char *p, size_t len) {
s = sdscatlen(s,"\"",1);
+ if (s == NULL) return NULL;
+
while(len--) {
switch(*p) {
case '\\':
@@ -397,6 +399,7 @@ sds sdscatrepr(sds s, char *p, size_t len) {
break;
}
p++;
+ if (s == NULL) return NULL;
}
return sdscatlen(s,"\"",1);
}
@@ -416,7 +419,7 @@ sds sdscatrepr(sds s, char *p, size_t len) {
sds *sdssplitargs(char *line, int *argc) {
char *p = line;
char *current = NULL;
- char **vector = NULL;
+ char **vector = NULL, **_vector = NULL;
*argc = 0;
while(1) {
@@ -427,7 +430,11 @@ sds *sdssplitargs(char *line, int *argc) {
int inq=0; /* set to 1 if we are in "quotes" */
int done=0;
- if (current == NULL) current = sdsempty();
+ if (current == NULL) {
+ current = sdsempty();
+ if (current == NULL) goto err;
+ }
+
while(!done) {
if (inq) {
if (*p == '\\' && *(p+1)) {
@@ -471,9 +478,13 @@ sds *sdssplitargs(char *line, int *argc) {
}
}
if (*p) p++;
+ if (current == NULL) goto err;
}
/* add the token to the vector */
- vector = realloc(vector,((*argc)+1)*sizeof(char*));
+ _vector = realloc(vector,((*argc)+1)*sizeof(char*));
+ if (_vector == NULL) goto err;
+
+ vector = _vector;
vector[*argc] = current;
(*argc)++;
current = NULL;
@@ -485,8 +496,8 @@ sds *sdssplitargs(char *line, int *argc) {
err:
while((*argc)--)
sdsfree(vector[*argc]);
- free(vector);
- if (current) sdsfree(current);
+ if (vector != NULL) free(vector);
+ if (current != NULL) sdsfree(current);
return NULL;
}