X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fstrv.c;h=00857e40a7a3b500865c9516a2bc69fd25a8432e;hb=f32d2db140150b9d38684a699c9875b6e24ca27c;hp=0df978d23b911f53be7e7c597e01c8b26c28a2a6;hpb=28849dbadb7cd127f7f89e8892ec94c6a05070da;p=elogind.git diff --git a/src/shared/strv.c b/src/shared/strv.c index 0df978d23..00857e40a 100644 --- a/src/shared/strv.c +++ b/src/shared/strv.c @@ -380,13 +380,19 @@ char *strv_join_quoted(char **l) { int strv_push(char ***l, char *value) { char **c; - unsigned n; + unsigned n, m; if (!value) return 0; n = strv_length(*l); - c = realloc(*l, sizeof(char*) * (n + 2)); + + /* increase and check for overflow */ + m = n + 2; + if (m < n) + return -ENOMEM; + + c = realloc_multiply(*l, sizeof(char*), m); if (!c) return -ENOMEM; @@ -399,13 +405,19 @@ int strv_push(char ***l, char *value) { int strv_push_prepend(char ***l, char *value) { char **c; - unsigned n, i; + unsigned n, m, i; if (!value) return 0; n = strv_length(*l); - c = new(char*, n + 2); + + /* increase and check for overflow */ + m = n + 2; + if (m < n) + return -ENOMEM; + + c = new(char*, m); if (!c) return -ENOMEM;