summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>2016-09-25 23:50:53 +0900
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2016-09-25 23:56:04 +0900
commite2a79ee17fafbd823472c576c6983faae42eb396 (patch)
tree3b08832d020665edbee755d66bfc3c04d3e66f6c
parentdd48e079384e4c4753a79e851807b638a2d32fff (diff)
downloadefl-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.c59
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);
}