James J. Lippard <[email protected]> wrote:

> I have a host which uses sensorsd which periodically stops running, which
> prompted me to dig into the cause, it's one or both of these two issues:
> 
> (1) memory leak on configuration reload, lines 753-758:
> 
> if (cgetstr(buf, "command", &ebuf) < 0)
>     ebuf = NULL;
> if (ebuf != NULL) {
>     p->command = ebuf;
>     ebuf = NULL;
> }
> 
> cgetstr allocates a new ebuf and the previous pointer is overwritten
> without freeing the old one.
> 
> Fix: insert free(p->command) before p->command = ebuf:
> 
> if (cgetstr(buf, "command", &ebuf) < 0)
>     ebuf = NULL;
> if (ebuf != NULL) {
>     free(p->command);
>     p->command = ebuf;
>     ebuf = NULL;
> }
> 
> (2) unnecessary exit in check_sdlim lines 367-368 for individual
> sensor failure that is handled differently from the same code in
> create_sdlim; sensorsd shouldn't be aborting because of a sysctl
> failure on one sensor.
> 
>               if (sysctl(mib, 5, &sensor, &len, NULL, 0) == -1)
>                       err(1, "sysctl");
> 
> vs. create_sdlim, lines 240-243:
> 
>                       if (sysctl(mib, 5, &sensor, &slen, NULL, 0) == -1) {
>                               if (errno != ENOENT)
>                                       warn("sysctl");
>                               continue;
>                       }
> 
> Fix: make check_sdlim code equivalent to create_sdlim:
> 
>                 if (sysctl(mib, 5, &sensor, &len, NULL, 0) == -1) {
>                       if (errno != ENOENT)
>                               warn("sysctl");
>                       continue;
>               }

Like this.

Index: sensorsd.c
===================================================================
RCS file: /cvs/src/usr.sbin/sensorsd/sensorsd.c,v
diff -u -p -u -r1.69 sensorsd.c
--- sensorsd.c  8 Mar 2023 04:43:15 -0000       1.69
+++ sensorsd.c  11 Apr 2026 17:33:22 -0000
@@ -363,8 +363,11 @@ check_sdlim(struct sdlim_t *sdlim, time_
 
                mib[3] = limit->type;
                mib[4] = limit->numt;
-               if (sysctl(mib, 5, &sensor, &len, NULL, 0) == -1)
-                       err(1, "sysctl");
+               if (sysctl(mib, 5, &sensor, &len, NULL, 0) == -1) {
+                       if (errno != ENOENT)
+                               warn("sysctl");
+                       continue;
+               }
 
                if (!(limit->flags & SENSORSD_L_ISTATUS)) {
                        enum sensor_status      newastatus = sensor.status;
@@ -753,6 +756,7 @@ parse_config_sdlim(struct sdlim_t *sdlim
                if (cgetstr(buf, "command", &ebuf) < 0)
                        ebuf = NULL;
                if (ebuf != NULL) {
+                       free(p->command);
                        p->command = ebuf;
                        ebuf = NULL;
                }

Reply via email to