X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fudev%2Fcollect%2Fcollect.c;h=1346f27f91be55190f80ee6e5a0308eb47314082;hb=ef89eef77ee098a6828169a6d0d74128e236bcbd;hp=4162c436b0e21ec4b3cb47c6b8b2dca0c378d2e8;hpb=669241a076108e0483d7d8475beaa506106d077e;p=elogind.git diff --git a/src/udev/collect/collect.c b/src/udev/collect/collect.c index 4162c436b..1346f27f9 100644 --- a/src/udev/collect/collect.c +++ b/src/udev/collect/collect.c @@ -35,8 +35,8 @@ #include "libudev-private.h" #include "macro.h" -#define BUFSIZE 16 -#define UDEV_ALARM_TIMEOUT 180 +#define BUFSIZE 16 +#define UDEV_ALARM_TIMEOUT 180 enum collect_state { STATE_NONE, @@ -93,7 +93,7 @@ static int prepare(char *dir, char *filename) if (stat(dir, &statbuf) < 0) mkdir(dir, 0700); - sprintf(buf, "%s/%s", dir, filename); + snprintf(buf, sizeof(buf), "%s/%s", dir, filename); fd = open(buf,O_RDWR|O_CREAT, S_IRUSR|S_IWUSR); if (fd < 0) @@ -139,12 +139,12 @@ static int checkout(int fd) restart: len = bufsize >> 1; - buf = calloc(1,bufsize + 1); - if (!buf) { - fprintf(stderr, "Out of memory.\n"); - return -1; - } + buf = malloc(bufsize + 1); + if (!buf) + return log_oom(); memset(buf, ' ', bufsize); + buf[bufsize] = '\0'; + ptr = buf + len; while ((read(fd, buf + len, len)) > 0) { while (ptr && *ptr) { @@ -167,7 +167,16 @@ static int checkout(int fd) if (debug) fprintf(stderr, "Found word %s\n", word); him = malloc(sizeof (struct _mate)); + if (!him) { + free(buf); + return log_oom(); + } him->name = strdup(word); + if (!him->name) { + free(buf); + free(him); + return log_oom(); + } him->state = STATE_OLD; udev_list_node_append(&him->node, &bunch); word = NULL; @@ -204,7 +213,7 @@ static void invite(char *us) udev_list_node_foreach(him_node, &bunch) { struct _mate *him = node_to_mate(him_node); - if (!strcmp(him->name, us)) { + if (streq(him->name, us)) { him->state = STATE_CONFIRMED; who = him; } @@ -232,7 +241,7 @@ static void reject(char *us) udev_list_node_foreach(him_node, &bunch) { struct _mate *him = node_to_mate(him_node); - if (!strcmp(him->name, us)) { + if (streq(him->name, us)) { him->state = STATE_NONE; who = him; } @@ -276,7 +285,7 @@ static int missing(int fd) buf = malloc(bufsize); if (!buf) - return -1; + return log_oom(); udev_list_node_foreach(him_node, &bunch) { struct _mate *him = node_to_mate(him_node); @@ -291,12 +300,15 @@ static int missing(int fd) tmpbuf = realloc(buf, bufsize); if (!tmpbuf) { free(buf); - return -1; + return log_oom(); } buf = tmpbuf; } snprintf(buf, strlen(him->name)+2, "%s ", him->name); - write(fd, buf, strlen(buf)); + if (write(fd, buf, strlen(buf)) < 0) { + free(buf); + return -1; + } } } @@ -402,7 +414,7 @@ int main(int argc, char **argv) if (debug) fprintf(stderr, "Using checkpoint '%s'\n", checkpoint); - util_strscpyl(tmpdir, sizeof(tmpdir), "/run/udev/collect", NULL); + strscpyl(tmpdir, sizeof(tmpdir), "/run/udev/collect", NULL); fd = prepare(tmpdir, checkpoint); if (fd < 0) { ret = 3; @@ -422,7 +434,7 @@ int main(int argc, char **argv) udev_list_node_foreach(him_node, &bunch) { struct _mate *him = node_to_mate(him_node); - if (!strcmp(him->name, argv[i])) + if (streq(him->name, argv[i])) who = him; } if (!who) { @@ -430,9 +442,19 @@ int main(int argc, char **argv) if (debug) fprintf(stderr, "ID %s: not in database\n", argv[i]); - him = malloc(sizeof (struct _mate)); - him->name = malloc(strlen(argv[i]) + 1); - strcpy(him->name, argv[i]); + him = new(struct _mate, 1); + if (!him) { + ret = ENOMEM; + goto out; + } + + him->name = strdup(argv[i]); + if (!him->name) { + free(him); + ret = ENOMEM; + goto out; + } + him->state = STATE_NONE; udev_list_node_append(&him->node, &bunch); } else {