Browse code

Prevent freeing a possible invalid pointer from journald

Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com>

Kenfe-Mickael Laventure authored on 2017/02/22 04:07:57
Showing 1 changed files
... ...
@@ -237,7 +237,10 @@ drain:
237 237
 
238 238
 	// free(NULL) is safe
239 239
 	C.free(unsafe.Pointer(oldCursor))
240
-	C.sd_journal_get_cursor(j, &cursor)
240
+	if C.sd_journal_get_cursor(j, &cursor) != 0 {
241
+		// ensure that we won't be freeing an address that's invalid
242
+		cursor = nil
243
+	}
241 244
 	return cursor
242 245
 }
243 246
 
... ...
@@ -272,7 +275,6 @@ func (s *journald) followJournal(logWatcher *logger.LogWatcher, config logger.Re
272 272
 		s.readers.mu.Lock()
273 273
 		delete(s.readers.readers, logWatcher)
274 274
 		s.readers.mu.Unlock()
275
-		C.sd_journal_close(j)
276 275
 		close(logWatcher.Msg)
277 276
 	}()
278 277
 
... ...
@@ -307,9 +309,9 @@ func (s *journald) readLogs(logWatcher *logger.LogWatcher, config logger.ReadCon
307 307
 	following := false
308 308
 	defer func(pfollowing *bool) {
309 309
 		if !*pfollowing {
310
-			C.sd_journal_close(j)
311 310
 			close(logWatcher.Msg)
312 311
 		}
312
+		C.sd_journal_close(j)
313 313
 	}(&following)
314 314
 	// Remove limits on the size of data items that we'll retrieve.
315 315
 	rc = C.sd_journal_set_data_threshold(j, C.size_t(0))