Add basic checks for rpm file format
authorJ. Ali Harlow <ali@juiblex.co.uk>
Wed, 22 Oct 2014 11:09:47 +0000 (12:09 +0100)
committerJ. Ali Harlow <ali@juiblex.co.uk>
Wed, 22 Oct 2014 11:09:47 +0000 (12:09 +0100)
librazor/rpm.c

index 643133c..7d8c4a5 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
  * Copyright (C) 2008  Red Hat, Inc
- * Copyright (C) 2009, 2011, 2012  J. Ali Harlow <ali@juiblex.co.uk>
+ * Copyright (C) 2009, 2011, 2012, 2014  J. Ali Harlow <ali@juiblex.co.uk>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 #define O_BINARY       0
 #endif
 
-#define        RPM_LEAD_SIZE 96
+struct rpm_lead {
+       unsigned char magic[4];
+       unsigned char major, minor;
+       short type;
+       short archnum;
+       char name[66];
+       short osnum;
+       short signature_type;
+       char reserved[16];
+};
+
+#define        RPM_LEAD_SIZE sizeof(struct rpm_lead)
+#define        RPM_LEAD_MAGIC "\xED\xAB\xEE\xDB"
 
 enum {
     PIPE       =  1,   /*!< pipe/fifo */
@@ -610,6 +622,7 @@ razor_rpm_get_details(struct razor_rpm *rpm, ...)
 RAZOR_EXPORT struct razor_rpm *
 razor_rpm_open(const char *filename, struct razor_error **error)
 {
+       struct rpm_lead *lead;
        struct razor_rpm *rpm;
        struct rpm_header_index *base, *index;
        unsigned int count, i, nindex, hsize;
@@ -631,6 +644,16 @@ razor_rpm_open(const char *filename, struct razor_error **error)
                return NULL;
        }
 
+       lead = rpm->map;
+       if (rpm->size < RPM_LEAD_SIZE ||
+           strncmp(lead->magic,RPM_LEAD_MAGIC,4) || lead->major != 3) {
+               razor_rpm_close(rpm);
+               razor_set_error(error, RAZOR_GENERAL_ERROR,
+                               RAZOR_GENERAL_ERROR_RPM_UNSUPPORTED,
+                               filename, "Not a recognized RPM format file");
+               return NULL;
+       }
+
        rpm->signature = rpm->map + RPM_LEAD_SIZE;
        nindex = ntohl(rpm->signature->nindex);
        hsize = ntohl(rpm->signature->hsize);