diff options
author | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2016-09-25 23:50:53 +0900 |
---|---|---|
committer | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2016-09-25 23:56:04 +0900 |
commit | e2a79ee17fafbd823472c576c6983faae42eb396 (patch) | |
tree | 3b08832d020665edbee755d66bfc3c04d3e66f6c | |
parent | dd48e079384e4c4753a79e851807b638a2d32fff (diff) | |
download | efl-e2a79ee17fafbd823472c576c6983faae42eb396.tar.gz |
efreet - fix command generation by fixing string buffer expansion
so by chance i discovered efreet is doing bad things(tm) when
expanding/appending to string buffers to generate commands based off
desktop files. the string append basically was buggy, so fixed it by
making it a lot simpler and more obvious and now reliable.
@fix
-rw-r--r-- | src/lib/efreet/efreet_desktop_command.c | 59 |
1 files changed, 17 insertions, 42 deletions
diff --git a/src/lib/efreet/efreet_desktop_command.c b/src/lib/efreet/efreet_desktop_command.c index 2748d0c40b..c98ce0fbdf 100644 --- a/src/lib/efreet/efreet_desktop_command.c +++ b/src/lib/efreet/efreet_desktop_command.c @@ -846,53 +846,28 @@ efreet_desktop_command_path_absolute(const char *path) static char * efreet_string_append(char *dest, int *size, int *len, const char *src) { - int l; - int off = 0; - - l = eina_strlcpy(dest + *len, src, *size - *len); - - while (l > *size - *len) - { - char *tmp; - /* we successfully appended this much */ - off += *size - *len - 1; - *len = *size - 1; - *size += 1024; - tmp = realloc(dest, *size); - if (!tmp) - { - free(dest); - return NULL; - } - dest = tmp; - *(dest + *len) = '\0'; - - l = eina_strlcpy(dest + *len, src + off, *size - *len); - } - *len += l; - - return dest; + int append_len = strlen(src); + + if ((*len + append_len + 1) > *size) + { + char *dest2 = realloc(dest, *size + append_len + 1024); + if (!dest2) return NULL; + + dest = dest2; + *size += append_len + 1024; + } + strcpy(dest + *len, src); + *len += append_len; + return dest; } static char * efreet_string_append_char(char *dest, int *size, int *len, char c) { - if (*len >= *size - 1) - { - char *tmp; - *size += 1024; - tmp = realloc(dest, *size); - if (!tmp) - { - free(dest); - return NULL; - } - dest = tmp; - } + char str[2]; - dest[(*len)++] = c; - dest[*len] = '\0'; - - return dest; + str[0] = c; + str[1] = 0; + return efreet_string_append(dest, size, len, str); } |