From: "Jonathan Armani" Subject: Re: libsndio: simplify cookie handling To: "Alexandre Ratchov" , tech@openbsd.org Date: Sat, 14 Mar 2026 15:27:57 +0100 ok On Fri, Mar 13, 2026, at 12:08, Alexandre Ratchov wrote: > Simple asnprintf(3) calls can replace the "clever" malloc(3) and > memcpy(3) calls that are much harder to review imo. > > OK? > > Index: aucat.c > =================================================================== > RCS file: /cvs/src/lib/libsndio/aucat.c,v > diff -u -p -r1.81 aucat.c > --- aucat.c 12 Mar 2026 15:35:24 -0000 1.81 > +++ aucat.c 13 Mar 2026 11:03:35 -0000 > @@ -204,30 +204,20 @@ _aucat_wdata(struct aucat *hdl, const vo > static int > aucat_mkcookie(unsigned char *cookie) > { > -#define COOKIE_DIR "/.sndio" > -#define COOKIE_SUFFIX "/.sndio/cookie" > -#define TEMPL_SUFFIX ".XXXXXXXX" > struct stat sb; > - char *home, *path = NULL, *tmp = NULL; > - size_t home_len, path_len; > + char *home, *dir = NULL, *path = NULL, *tmp = NULL; > int fd, len; > > - /* please gcc */ > - path_len = 0xdeadbeef; > - > /* > * try to load the cookie > */ > home = issetugid() ? NULL : getenv("HOME"); > if (home == NULL) > goto bad_gen; > - home_len = strlen(home); > - path = malloc(home_len + sizeof(COOKIE_SUFFIX)); > - if (path == NULL) > + if (asprintf(&dir, "%s/.sndio", home) == -1) > + goto bad_gen; > + if (asprintf(&path, "%s/cookie", dir) == -1) > goto bad_gen; > - memcpy(path, home, home_len); > - memcpy(path + home_len, COOKIE_SUFFIX, sizeof(COOKIE_SUFFIX)); > - path_len = home_len + sizeof(COOKIE_SUFFIX) - 1; > fd = open(path, O_RDONLY|O_CLOEXEC); > if (fd == -1) { > if (errno != ENOENT) > @@ -265,21 +255,12 @@ bad_gen: > * try to save the cookie > */ > > - if (home == NULL) > + if (path == NULL) > goto done; > - tmp = malloc(path_len + sizeof(TEMPL_SUFFIX)); > - if (tmp == NULL) > + if (mkdir(dir, 0755) == -1 && errno != EEXIST) > goto done; > - > - /* create ~/.sndio directory */ > - memcpy(tmp, home, home_len); > - memcpy(tmp + home_len, COOKIE_DIR, sizeof(COOKIE_DIR)); > - if (mkdir(tmp, 0755) == -1 && errno != EEXIST) > + if (asprintf(&tmp, "%s.XXXXXXXX", path) == -1) > goto done; > - > - /* create cookie file in it */ > - memcpy(tmp, path, path_len); > - memcpy(tmp + path_len, TEMPL_SUFFIX, sizeof(TEMPL_SUFFIX)); > fd = mkstemp(tmp); > if (fd == -1) { > DPERROR(tmp); > @@ -299,6 +280,7 @@ bad_gen: > done: > free(tmp); > free(path); > + free(dir); > return 1; > }