diff --git a/smartmontools/CHANGELOG b/smartmontools/CHANGELOG
index 9237d9ee01af07d58ad316b7ce599a756a777e0b..64b69d8113fc6b61ee7b5a67028c5b2a5ed7bc0d 100644
--- a/smartmontools/CHANGELOG
+++ b/smartmontools/CHANGELOG
@@ -43,6 +43,8 @@ NOTES FOR FUTURE RELEASES: see TODO file.
 
 <DEVELOPERS: ADDITIONS TO THE CHANGE LOG GO JUST BELOW HERE, PLEASE>
 
+  [AS] FreeBSD: fixing crash on kFreeBSD (#29), patch provided by Petr Salinger
+
   [CF] Makefile.am: 'make check' now tests the syntax of drivedb.h.
 
   [CF] Cygwin: Open drive database files in text mode.
diff --git a/smartmontools/os_freebsd.cpp b/smartmontools/os_freebsd.cpp
index e7af9896096622b045c383ba4732401a7d974764..a439b3d23e5bef0fe6e106f65db0a8bef43e35b2 100644
--- a/smartmontools/os_freebsd.cpp
+++ b/smartmontools/os_freebsd.cpp
@@ -165,7 +165,7 @@ private:
 #ifdef __GLIBC__
 static inline void * reallocf(void *ptr, size_t size) {
    void *rv = realloc(ptr, size);
-   if(rv == NULL)
+   if((rv == NULL) && (size != 0))
      free(ptr);
    return rv;
    }
@@ -1800,10 +1800,10 @@ smart_device * freebsd_smart_interface::autodetect_smart_device(const char * nam
           cam_close_device(cam_dev);
           if(usbdevlist(bus,vendor_id, product_id, version)){
             const char * usbtype = get_usb_dev_type_by_id(vendor_id, product_id, version);
-            if (!usbtype)
-              return false;
-            return get_sat_device(usbtype, new freebsd_scsi_device(this, name, ""));
+            if (usbtype)
+              return get_sat_device(usbtype, new freebsd_scsi_device(this, name, ""));
           }
+          return false;
         }
 #if FREEBSDVER > 800100
         // check if we have ATA device connected to CAM (ada)