@@ -95,35 +95,41 @@ int cg_enumerate_processes(const char *controller, const char *path, FILE **ret)
9595 return cg_enumerate_items (controller , path , ret , "cgroup.procs" );
9696}
9797
98- int cg_read_pid (FILE * f , pid_t * ret ) {
98+ int cg_read_pid (FILE * f , pid_t * ret , CGroupFlags flags ) {
9999 unsigned long ul ;
100100
101101 /* Note that the cgroup.procs might contain duplicates! See cgroups.txt for details. */
102102
103103 assert (f );
104104 assert (ret );
105105
106- errno = 0 ;
107- if (fscanf (f , "%lu" , & ul ) != 1 ) {
106+ for (;;) {
107+ errno = 0 ;
108+ if (fscanf (f , "%lu" , & ul ) != 1 ) {
108109
109- if (feof (f )) {
110- * ret = 0 ;
111- return 0 ;
110+ if (feof (f )) {
111+ * ret = 0 ;
112+ return 0 ;
113+ }
114+
115+ return errno_or_else (EIO );
112116 }
113117
114- return errno_or_else ( EIO );
115- }
118+ if ( ul > PID_T_MAX )
119+ return - EIO ;
116120
117- if (ul <= 0 )
118- return - EIO ;
119- if (ul > PID_T_MAX )
120- return - EIO ;
121+ /* In some circumstances (e.g. WSL), cgroups might contain unmappable PIDs from other
122+ * contexts. These show up as zeros, and depending on the caller, can either be plain
123+ * skipped over, or returned as-is. */
124+ if (ul == 0 && !FLAGS_SET (flags , CGROUP_DONT_SKIP_UNMAPPED ))
125+ continue ;
121126
122- * ret = (pid_t ) ul ;
123- return 1 ;
127+ * ret = (pid_t ) ul ;
128+ return 1 ;
129+ }
124130}
125131
126- int cg_read_pidref (FILE * f , PidRef * ret ) {
132+ int cg_read_pidref (FILE * f , PidRef * ret , CGroupFlags flags ) {
127133 int r ;
128134
129135 assert (f );
@@ -132,14 +138,17 @@ int cg_read_pidref(FILE *f, PidRef *ret) {
132138 for (;;) {
133139 pid_t pid ;
134140
135- r = cg_read_pid (f , & pid );
141+ r = cg_read_pid (f , & pid , flags );
136142 if (r < 0 )
137143 return r ;
138144 if (r == 0 ) {
139145 * ret = PIDREF_NULL ;
140146 return 0 ;
141147 }
142148
149+ if (pid == 0 )
150+ return - EREMOTE ;
151+
143152 r = pidref_set_pid (ret , pid );
144153 if (r >= 0 )
145154 return 1 ;
@@ -343,7 +352,7 @@ static int cg_kill_items(
343352 for (;;) {
344353 _cleanup_ (pidref_done ) PidRef pidref = PIDREF_NULL ;
345354
346- r = cg_read_pidref (f , & pidref );
355+ r = cg_read_pidref (f , & pidref , /* flags = */ 0 );
347356 if (r < 0 )
348357 return RET_GATHER (ret , r );
349358 if (r == 0 )
@@ -938,7 +947,7 @@ int cg_is_empty(const char *controller, const char *path) {
938947 if (r < 0 )
939948 return r ;
940949
941- r = cg_read_pid (f , & pid );
950+ r = cg_read_pid (f , & pid , CGROUP_DONT_SKIP_UNMAPPED );
942951 if (r < 0 )
943952 return r ;
944953
0 commit comments