Merge pull request #580 from charsyam/feature/fix-realloc
fix common realloc mistake and add null check more
This commit is contained in:
commit
747d78beaa
23
sds.c
23
sds.c
@ -219,7 +219,10 @@ sds sdsMakeRoomFor(sds s, size_t addlen) {
|
|||||||
hdrlen = sdsHdrSize(type);
|
hdrlen = sdsHdrSize(type);
|
||||||
if (oldtype==type) {
|
if (oldtype==type) {
|
||||||
newsh = s_realloc(sh, hdrlen+newlen+1);
|
newsh = s_realloc(sh, hdrlen+newlen+1);
|
||||||
if (newsh == NULL) return NULL;
|
if (newsh == NULL) {
|
||||||
|
s_free(sh);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
s = (char*)newsh+hdrlen;
|
s = (char*)newsh+hdrlen;
|
||||||
} else {
|
} else {
|
||||||
/* Since the header size changes, need to move the string forward,
|
/* Since the header size changes, need to move the string forward,
|
||||||
@ -592,6 +595,7 @@ sds sdscatfmt(sds s, char const *fmt, ...) {
|
|||||||
/* Make sure there is always space for at least 1 char. */
|
/* Make sure there is always space for at least 1 char. */
|
||||||
if (sdsavail(s)==0) {
|
if (sdsavail(s)==0) {
|
||||||
s = sdsMakeRoomFor(s,1);
|
s = sdsMakeRoomFor(s,1);
|
||||||
|
if (s == NULL) goto fmt_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(*f) {
|
switch(*f) {
|
||||||
@ -605,6 +609,7 @@ sds sdscatfmt(sds s, char const *fmt, ...) {
|
|||||||
l = (next == 's') ? strlen(str) : sdslen(str);
|
l = (next == 's') ? strlen(str) : sdslen(str);
|
||||||
if (sdsavail(s) < l) {
|
if (sdsavail(s) < l) {
|
||||||
s = sdsMakeRoomFor(s,l);
|
s = sdsMakeRoomFor(s,l);
|
||||||
|
if (s == NULL) goto fmt_error;
|
||||||
}
|
}
|
||||||
memcpy(s+i,str,l);
|
memcpy(s+i,str,l);
|
||||||
sdsinclen(s,l);
|
sdsinclen(s,l);
|
||||||
@ -621,6 +626,7 @@ sds sdscatfmt(sds s, char const *fmt, ...) {
|
|||||||
l = sdsll2str(buf,num);
|
l = sdsll2str(buf,num);
|
||||||
if (sdsavail(s) < l) {
|
if (sdsavail(s) < l) {
|
||||||
s = sdsMakeRoomFor(s,l);
|
s = sdsMakeRoomFor(s,l);
|
||||||
|
if (s == NULL) goto fmt_error;
|
||||||
}
|
}
|
||||||
memcpy(s+i,buf,l);
|
memcpy(s+i,buf,l);
|
||||||
sdsinclen(s,l);
|
sdsinclen(s,l);
|
||||||
@ -638,6 +644,7 @@ sds sdscatfmt(sds s, char const *fmt, ...) {
|
|||||||
l = sdsull2str(buf,unum);
|
l = sdsull2str(buf,unum);
|
||||||
if (sdsavail(s) < l) {
|
if (sdsavail(s) < l) {
|
||||||
s = sdsMakeRoomFor(s,l);
|
s = sdsMakeRoomFor(s,l);
|
||||||
|
if (s == NULL) goto fmt_error;
|
||||||
}
|
}
|
||||||
memcpy(s+i,buf,l);
|
memcpy(s+i,buf,l);
|
||||||
sdsinclen(s,l);
|
sdsinclen(s,l);
|
||||||
@ -662,6 +669,10 @@ sds sdscatfmt(sds s, char const *fmt, ...) {
|
|||||||
/* Add null-term */
|
/* Add null-term */
|
||||||
s[i] = '\0';
|
s[i] = '\0';
|
||||||
return s;
|
return s;
|
||||||
|
|
||||||
|
fmt_error:
|
||||||
|
va_end(ap);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove the part of the string from left and from right composed just of
|
/* Remove the part of the string from left and from right composed just of
|
||||||
@ -1018,10 +1029,18 @@ sds *sdssplitargs(const char *line, int *argc) {
|
|||||||
if (*p) p++;
|
if (*p) p++;
|
||||||
}
|
}
|
||||||
/* add the token to the vector */
|
/* add the token to the vector */
|
||||||
vector = s_realloc(vector,((*argc)+1)*sizeof(char*));
|
{
|
||||||
|
char **new_vector = s_realloc(vector,((*argc)+1)*sizeof(char*));
|
||||||
|
if (new_vector == NULL) {
|
||||||
|
s_free(vector);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector = new_vector;
|
||||||
vector[*argc] = current;
|
vector[*argc] = current;
|
||||||
(*argc)++;
|
(*argc)++;
|
||||||
current = NULL;
|
current = NULL;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Even on empty input string return something not NULL. */
|
/* Even on empty input string return something not NULL. */
|
||||||
if (vector == NULL) vector = s_malloc(sizeof(void*));
|
if (vector == NULL) vector = s_malloc(sizeof(void*));
|
||||||
|
Loading…
Reference in New Issue
Block a user