]> git.ipfire.org Git - thirdparty/shairport-sync.git/commitdiff
Use snprintf in place of sprintf.
authorMike Brady <mikebrady@eircom.net>
Sun, 8 Apr 2018 14:36:05 +0000 (15:36 +0100)
committerMike Brady <mikebrady@eircom.net>
Sun, 8 Apr 2018 14:36:05 +0000 (15:36 +0100)
common.c
dacp.c
dbus-service.c
mdns.c
mdns_avahi.c
mdns_external.c
metadata_hub.c
metadata_hub.h
mpris-service.c
rtp.c
rtsp.c

index 6c6818091077c27f99339951aa664f30e552773b..81e882ad6e74a2d3d7923eb6c698851ed20e2f38 100644 (file)
--- a/common.c
+++ b/common.c
@@ -565,7 +565,7 @@ void command_set_volume(double volume) {
         inform("Couldn't allocate memory for set_volume argument string");
       } else {
         memset(command_buffer, 0, command_buffer_size);
-        sprintf(command_buffer, "%s%f", config.cmd_set_volume, volume);
+        snprintf(command_buffer, command_buffer_size, "%s%f", config.cmd_set_volume, volume);
         // debug(1,"command_buffer is \"%s\".",command_buffer);
         int argC;
         char **argV;
diff --git a/dacp.c b/dacp.c
index e22ac63afdd21ea8cbe798dc9d027fdca47d2501..ffdae8c0b39d19f8a406acd6529c80cab9096f0c 100644 (file)
--- a/dacp.c
+++ b/dacp.c
@@ -648,7 +648,7 @@ void *dacp_monitor_thread_code(__attribute__((unused)) void *na) {
                     char *pt = st;
                     int it;
                     for (it = 0; it < 16; it++) {
-                      sprintf(pt, "%02X", metadata_store.item_composite_id[it]);
+                      snprintf(pt, 3, "%02X", metadata_store.item_composite_id[it]);
                       pt += 2;
                     }
                     *pt = 0;
index 26834e58d56d45349d8bc7120af220123d8890e6..20150abd8d31d24d14f38afae0f2ad822f48951d 100644 (file)
@@ -141,8 +141,7 @@ void dbus_metadata_watcher(struct metadata_bundle *argc, __attribute__((unused))
   // Make up the artwork URI if we have one
   if (argc->cover_art_pathname) {
     char artURIstring[1024];
-    sprintf(artURIstring, "file://%s", argc->cover_art_pathname);
-    // sprintf(artURIstring,"");
+    snprintf(artURIstring, sizeof(artURIstring), "file://%s", argc->cover_art_pathname);
     // debug(1,"artURI String: \"%s\".",artURIstring);
     GVariant *artUrl = g_variant_new("s", artURIstring);
     g_variant_builder_add(dict_builder, "{sv}", "mpris:artUrl", artUrl);
@@ -152,7 +151,7 @@ void dbus_metadata_watcher(struct metadata_bundle *argc, __attribute__((unused))
   if ((argc->track_metadata) && (argc->track_metadata->item_id)) {
     char trackidstring[128];
     // debug(1, "Set ID using mper ID: \"%u\".",argc->item_id);
-    sprintf(trackidstring, "/org/gnome/ShairportSync/mper_%u", argc->track_metadata->item_id);
+    snprintf(trackidstring, sizeof(trackidstring), "/org/gnome/ShairportSync/mper_%u", argc->track_metadata->item_id);
     GVariant *trackid = g_variant_new("o", trackidstring);
     g_variant_builder_add(dict_builder, "{sv}", "mpris:trackid", trackid);
   }
@@ -733,7 +732,7 @@ static void on_dbus_name_lost(__attribute__((unused)) GDBusConnection *connectio
   //      name, (config.dbus_service_bus_type == DBT_session) ? "session" : "system");
   pid_t pid = getpid();
   char interface_name[256] = "";
-  sprintf(interface_name, "org.gnome.ShairportSync.i%d", pid);
+  snprintf(interface_name, sizeof(interface_name), "org.gnome.ShairportSync.i%d", pid);
   GBusType dbus_bus_type = G_BUS_TYPE_SYSTEM;
   if (config.dbus_service_bus_type == DBT_session)
     dbus_bus_type = G_BUS_TYPE_SESSION;
diff --git a/mdns.c b/mdns.c
index 6634d1d02e544b61063e79f08ea8b707154d1063..220478a83cc45c2165feedbed7768535762be8d2 100644 (file)
--- a/mdns.c
+++ b/mdns.c
@@ -63,7 +63,7 @@ void mdns_register(void) {
   char *p = mdns_service_name;
   int i;
   for (i = 0; i < 6; i++) {
-    sprintf(p, "%02X", config.hw_addr[i]);
+    snprintf(p, 3, "%02X", config.hw_addr[i]);
     p += 2;
   }
   *p++ = '@';
index 2f948bff24c6eaa62928abd412606b005f6a41bb..f231eecdf52588cc304d953c83825817e1d22b13 100644 (file)
@@ -95,7 +95,7 @@ static void resolve_callback(AvahiServiceResolver *r, AVAHI_GCC_UNUSED AvahiIfIn
 #ifdef CONFIG_METADATA
         char portstring[20];
         memset(portstring, 0, sizeof(portstring));
-        sprintf(portstring, "%u", port);
+        snprintf(portstring, sizeof(portstring), "%u", port);
         send_ssnc_metadata('dapo', strdup(portstring), strlen(portstring), 0);
 #endif
       }
index 6f4e10f470b26fbd3b79beb0a75cf8f248290814..e3a241fde44433e9ddfc4b07d68b992e50eba77d 100644 (file)
@@ -85,7 +85,7 @@ static int fork_execvp(const char *file, char *const argv[]) {
 
 static int mdns_external_avahi_register(char *apname, __attribute__((unused)) int port) {
   char mdns_port[6];
-  sprintf(mdns_port, "%d", config.port);
+  snprintf(mdns_port, sizeof(mdns_port), "%d", config.port);
 
   char *argvwithoutmetadata[] = {
       NULL, apname, config.regtype, mdns_port, MDNS_RECORD_WITHOUT_METADATA, NULL};
@@ -124,7 +124,7 @@ static int mdns_external_avahi_register(char *apname, __attribute__((unused)) in
 
 static int mdns_external_dns_sd_register(char *apname, __attribute__((unused)) int port) {
   char mdns_port[6];
-  sprintf(mdns_port, "%d", config.port);
+  snprintf(mdns_port, sizeof(mdns_port), "%d", config.port);
 
   char *argvwithoutmetadata[] = {
       NULL, apname, config.regtype, mdns_port, MDNS_RECORD_WITHOUT_METADATA, NULL};
index 04c31b2ae3cb3cc129f5b25aedb2dfa18b532265..ff7eef46204ac50aae9ba6877d0e6ebc02ec7600 100644 (file)
@@ -72,6 +72,7 @@ void metadata_hub_release_track_metadata(struct track_metadata_bundle *track_met
   if (track_metadata) {
     release_char_string(&track_metadata->track_name);
     release_char_string(&track_metadata->artist_name);
+    release_char_string(&track_metadata->album_artist_name);
     release_char_string(&track_metadata->album_name);
     release_char_string(&track_metadata->genre);
     release_char_string(&track_metadata->comment);
@@ -79,7 +80,10 @@ void metadata_hub_release_track_metadata(struct track_metadata_bundle *track_met
     release_char_string(&track_metadata->file_kind);
     release_char_string(&track_metadata->song_description);
     release_char_string(&track_metadata->song_album_artist);
-    release_char_string(&track_metadata->sort_as);
+    release_char_string(&track_metadata->sort_name);
+    release_char_string(&track_metadata->sort_artist);
+    release_char_string(&track_metadata->sort_album);
+    release_char_string(&track_metadata->sort_composer);
     free((char *)track_metadata);
   } else {
     debug(3, "Asked to release non-existent track metadata");
@@ -213,7 +217,7 @@ char *metadata_write_image_file(const char *buf, int len) {
   char jpg[] = "jpg";
   int i;
   for (i = 0; i < 16; i++)
-    sprintf(&img_md5_str[i * 2], "%02x", (uint8_t)img_md5[i]);
+    snprintf(&img_md5_str[i * 2], 3, "%02x", (uint8_t)img_md5[i]);
   // see if the file is a jpeg or a png
   if (strncmp(buf, "\xFF\xD8\xFF", 3) == 0)
     ext = jpg;
@@ -327,6 +331,14 @@ void metadata_hub_process_metadata(uint32_t type, uint32_t code, char *data, uin
         debug(1, "No track metadata memory allocated when artist name received!");
       }
       break;
+    case 'assl':
+      if (track_metadata) {
+        track_metadata->album_artist_name = strndup(data, length);
+        debug(2, "MH Album Artist name set to: \"%s\"", track_metadata->album_artist_name);
+      } else {
+        debug(1, "No track metadata memory allocated when album artist name received!");
+      }
+      break;
     case 'ascm':
       if (track_metadata) {
         track_metadata->comment = strndup(data, length);
@@ -372,21 +384,48 @@ void metadata_hub_process_metadata(uint32_t type, uint32_t code, char *data, uin
         track_metadata->song_album_artist = strndup(data, length);
         debug(2, "MH Song Album Artist set to: \"%s\"", track_metadata->song_album_artist);
       } else {
-        debug(1, "No track metadata memory allocated when song description received!");
+        debug(1, "No track metadata memory allocated when song artist received!");
       }
       break;
     case 'assn':
       if (track_metadata) {
-        track_metadata->sort_as = strndup(data, length);
-        debug(2, "MH Sort As set to: \"%s\"", track_metadata->sort_as);
+        track_metadata->sort_name = strndup(data, length);
+        debug(2, "MH Sort Name set to: \"%s\"", track_metadata->sort_name);
+      } else {
+        debug(1,
+              "No track metadata memory allocated when sort name description received!");
+      }
+      break;
+    case 'assa':
+      if (track_metadata) {
+        track_metadata->sort_artist = strndup(data, length);
+        debug(2, "MH Sort Artist set to: \"%s\"", track_metadata->sort_artist);
+      } else {
+        debug(1,
+              "No track metadata memory allocated when sort artist description received!");
+      }
+      break;
+    case 'assu':
+      if (track_metadata) {
+        track_metadata->sort_album = strndup(data, length);
+        debug(2, "MH Sort Album set to: \"%s\"", track_metadata->sort_album);
       } else {
         debug(1,
-              "No track metadata memory allocated when sort as (sort name) description received!");
+              "No track metadata memory allocated when sort album description received!");
+      }
+      break;
+    case 'assc':
+      if (track_metadata) {
+        track_metadata->sort_composer = strndup(data, length);
+        debug(2, "MH Sort Composer set to: \"%s\"", track_metadata->sort_composer);
+      } else {
+        debug(1,
+              "No track metadata memory allocated when sort composer description received!");
       }
       break;
 
-      //   default:
-      /*
+    default:  
+    /*    
         {
           char typestring[5];
           *(uint32_t *)typestring = htonl(type);
@@ -403,7 +442,9 @@ void metadata_hub_process_metadata(uint32_t type, uint32_t code, char *data, uin
           if (payload)
             free(payload);
         }
-      */
+    */
+      break;
+      
     }
   } else if (type == 'ssnc') {
     switch (code) {
index 3ffc0dc1b02f3b98d0ef81232bf31a9922fd52aa..29825555e3e376e7e3ad789871fb64a1beafb4bc 100644 (file)
@@ -32,6 +32,7 @@ typedef struct track_metadata_bundle {
       item_composite_id[16]; // seems to be nowplaying 4 ids: dbid, plid, playlistItem, itemid
   char *track_name;          // a malloced string -- if non-zero, free it before replacing it
   char *artist_name;         // a malloced string -- if non-zero, free it before replacing it
+  char *album_artist_name;   // a malloced string -- if non-zero, free it before replacing it
   char *album_name;          // a malloced string -- if non-zero, free it before replacing it
   char *genre;               // a malloced string -- if non-zero, free it before replacing it
   char *comment;             // a malloced string -- if non-zero, free it before replacing it
@@ -39,7 +40,10 @@ typedef struct track_metadata_bundle {
   char *file_kind;           // a malloced string -- if non-zero, free it before replacing it
   char *song_description;    // a malloced string -- if non-zero, free it before replacing it
   char *song_album_artist;   // a malloced string -- if non-zero, free it before replacing it
-  char *sort_as;             // a malloced string -- if non-zero, free it before replacing it
+  char *sort_name;           // a malloced string -- if non-zero, free it before replacing it
+  char *sort_artist;         // a malloced string -- if non-zero, free it before replacing it
+  char *sort_album;          // a malloced string -- if non-zero, free it before replacing it
+  char *sort_composer;       // a malloced string -- if non-zero, free it before replacing it
   uint32_t songtime_in_milliseconds;
 } track_metadata_bundle;
 
index 30a09e011d1eca5f3d15c606c2d286701b12b8a3..3d6cf96bc7f3a400a7c0b4ea444163a11f8b66c3 100644 (file)
@@ -91,8 +91,7 @@ void mpris_metadata_watcher(struct metadata_bundle *argc, __attribute__((unused)
   // Make up the artwork URI if we have one
   if (argc->cover_art_pathname) {
     char artURIstring[1024];
-    sprintf(artURIstring, "file://%s", argc->cover_art_pathname);
-    // sprintf(artURIstring,"");
+    snprintf(artURIstring, sizeof(artURIstring), "file://%s", argc->cover_art_pathname);
     // debug(1,"artURI String: \"%s\".",artURIstring);
     GVariant *artUrl = g_variant_new("s", artURIstring);
     g_variant_builder_add(dict_builder, "{sv}", "mpris:artUrl", artUrl);
@@ -109,7 +108,7 @@ void mpris_metadata_watcher(struct metadata_bundle *argc, __attribute__((unused)
     for (it = 0; it < 16; it++) {
       if (argc->track_metadata->item_composite_id[it])
         non_zero = 1;
-      sprintf(pt, "%02X", argc->track_metadata->item_composite_id[it]);
+      snprintf(pt, 3, "%02X", argc->track_metadata->item_composite_id[it]);
       pt += 2;
     }
   }
@@ -118,13 +117,13 @@ void mpris_metadata_watcher(struct metadata_bundle *argc, __attribute__((unused)
   if (non_zero) {
     // debug(1, "Set ID using composite ID: \"0x%s\".", st);
     char trackidstring[1024];
-    sprintf(trackidstring, "/org/gnome/ShairportSync/%s", st);
+    snprintf(trackidstring, sizeof(trackidstring), "/org/gnome/ShairportSync/%s", st);
     GVariant *trackid = g_variant_new("o", trackidstring);
     g_variant_builder_add(dict_builder, "{sv}", "mpris:trackid", trackid);
   } else if ((argc->track_metadata) && (argc->track_metadata->item_id)) {
     char trackidstring[128];
     // debug(1, "Set ID using mper ID: \"%u\".",argc->item_id);
-    sprintf(trackidstring, "/org/gnome/ShairportSync/mper_%u", argc->track_metadata->item_id);
+    snprintf(trackidstring, sizeof(trackidstring), "/org/gnome/ShairportSync/mper_%u", argc->track_metadata->item_id);
     GVariant *trackid = g_variant_new("o", trackidstring);
     g_variant_builder_add(dict_builder, "{sv}", "mpris:trackid", trackid);
   }
@@ -292,7 +291,7 @@ static void on_mpris_name_lost(__attribute__((unused)) GDBusConnection *connecti
   //      name,(mpris_bus_type==G_BUS_TYPE_SESSION) ? "session" : "system");
   pid_t pid = getpid();
   char interface_name[256] = "";
-  sprintf(interface_name, "org.mpris.MediaPlayer2.ShairportSync.i%d", pid);
+  snprintf(interface_name,  sizeof(interface_name), "org.mpris.MediaPlayer2.ShairportSync.i%d", pid);
   GBusType mpris_bus_type = G_BUS_TYPE_SYSTEM;
   if (config.mpris_service_bus_type == DBT_session)
     mpris_bus_type = G_BUS_TYPE_SESSION;
diff --git a/rtp.c b/rtp.c
index 25d2198acb2ed534d6d6f6b2b66f511bb7419264..5b88c3af3752bb4baba2c3ee82c0f825d94a6034 100644 (file)
--- a/rtp.c
+++ b/rtp.c
@@ -216,7 +216,7 @@ void *rtp_control_receiver(void *arg) {
                                                            char *obfp = obf;
                                                            int obfc;
                                                            for (obfc = 0; obfc < plen; obfc++) {
-                                                             sprintf(obfp, "%02X", packet[obfc]);
+                                                             snprintf(obfp, 3, "%02X", packet[obfc]);
                                                              obfp += 2;
                                                            };
                                                            *obfp = 0;
@@ -500,7 +500,7 @@ void *rtp_timing_receiver(void *arg) {
       char *obfp = obf;
       int obfc;
       for (obfc=0;obfc<plen;obfc++) {
-        sprintf(obfp,"%02X",packet[obfc]);
+        snprintf(obfp, 3, "%02X", packet[obfc]);
         obfp+=2;
       };
       *obfp=0;
diff --git a/rtsp.c b/rtsp.c
index 7bc1334ea32f8645cb2b3d7a3717ff1fe242aa0b..32fe548d641a4b6861a4589fb44ef10301b902c5 100644 (file)
--- a/rtsp.c
+++ b/rtsp.c
@@ -378,7 +378,7 @@ static void debug_print_msg_content(int level, rtsp_message *msg) {
       char *obfp = obf;
       int obfc;
       for (obfc = 0; obfc < msg->contentlength; obfc++) {
-        sprintf(obfp, "%02X", msg->content[obfc]);
+        snprintf(obfp, 3, "%02X", msg->content[obfc]);
         obfp += 2;
       };
       *obfp = 0;
@@ -823,9 +823,8 @@ static void handle_setup(rtsp_conn_info *conn, rtsp_message *req, rtsp_message *
       strcat(hdr, q); // should unsplice the timing port entry
   }
 
-  char *resphdr = alloca(200);
-  *resphdr = 0;
-  sprintf(resphdr, "RTP/AVP/"
+  char resphdr[256] = "";
+  snprintf(resphdr, sizeof(resphdr), "RTP/AVP/"
                    "UDP;unicast;interleaved=0-1;mode=record;control_port=%d;"
                    "timing_port=%d;server_"
                    "port=%d",
@@ -1328,7 +1327,7 @@ static void handle_get_parameter(__attribute__((unused)) rtsp_conn_info *conn, r
     char *p = malloc(128); // will be automatically deallocated with the response is deleted
     if (p) {
       resp->content = p;
-      resp->contentlength = sprintf(p, "\r\nvolume: %.6f\r\n", config.airplay_volume);
+      resp->contentlength = snprintf(p, 128, "\r\nvolume: %.6f\r\n", config.airplay_volume);
     } else {
       debug(1, "Couldn't allocate space for a response.");
     }
@@ -1779,7 +1778,7 @@ static int rtsp_auth(char **nonce, rtsp_message *req, rtsp_message *resp) {
   int i;
   unsigned char buf[33];
   for (i = 0; i < 16; i++)
-    sprintf((char *)buf + 2 * i, "%02x", digest_urp[i]);
+    snprintf((char *)buf + 2 * i, 3, "%02x", digest_urp[i]);
 
 #ifdef HAVE_LIBSSL
   MD5_Init(&ctx);
@@ -1788,7 +1787,7 @@ static int rtsp_auth(char **nonce, rtsp_message *req, rtsp_message *resp) {
   MD5_Update(&ctx, *nonce, strlen(*nonce));
   MD5_Update(&ctx, ":", 1);
   for (i = 0; i < 16; i++)
-    sprintf((char *)buf + 2 * i, "%02x", digest_mu[i]);
+    snprintf((char *)buf + 2 * i, 3, "%02x", digest_mu[i]);
   MD5_Update(&ctx, buf, 32);
   MD5_Final(digest_total, &ctx);
 #endif
@@ -1800,7 +1799,7 @@ static int rtsp_auth(char **nonce, rtsp_message *req, rtsp_message *resp) {
   mbedtls_md5_update(&tctx, (const unsigned char *)*nonce, strlen(*nonce));
   mbedtls_md5_update(&tctx, (unsigned char *)":", 1);
   for (i = 0; i < 16; i++)
-    sprintf((char *)buf + 2 * i, "%02x", digest_mu[i]);
+    snprintf((char *)buf + 2 * i, 3, "%02x", digest_mu[i]);
   mbedtls_md5_update(&tctx, buf, 32);
   mbedtls_md5_finish(&tctx, digest_total);
 #endif
@@ -1812,13 +1811,13 @@ static int rtsp_auth(char **nonce, rtsp_message *req, rtsp_message *resp) {
   md5_update(&tctx, (const unsigned char *)*nonce, strlen(*nonce));
   md5_update(&tctx, (unsigned char *)":", 1);
   for (i = 0; i < 16; i++)
-    sprintf((char *)buf + 2 * i, "%02x", digest_mu[i]);
+    snprintf((char *)buf + 2 * i, 3, "%02x", digest_mu[i]);
   md5_update(&tctx, buf, 32);
   md5_finish(&tctx, digest_total);
 #endif
 
   for (i = 0; i < 16; i++)
-    sprintf((char *)buf + 2 * i, "%02x", digest_total[i]);
+    snprintf((char *)buf + 2 * i, 3, "%02x", digest_total[i]);
 
   if (!strcmp(response, (const char *)buf))
     return 0;