From 09fc258b5406bfcc2ac7d57525f2dacdd1015caa Mon Sep 17 00:00:00 2001
From: Daniel Golle <daniel@makrotopia.org>
Date: Sun, 13 Jun 2021 19:41:57 +0100
Subject: [PATCH] auc: fix several issues

 * don't segfault if server reply is incomplete
 * always request 'generic' image on x86/generic and x86/64
 * make SNAPSHOT branches sticky, eg. stay on 21.02-SNAPSHOT and do
   not 'upgrade' to 21.02.0-rc2.
 * output requested server URL when debugging

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
(cherry picked from commit 02bc1fc929e285153dee318f858f6781bab49895)
---
 utils/auc/src/auc.c | 40 +++++++++++++++++++++++++++++++---------
 1 file changed, 31 insertions(+), 9 deletions(-)

diff --git a/utils/auc/src/auc.c b/utils/auc/src/auc.c
index 8770d9a1d3..cf49948b8f 100644
--- a/utils/auc/src/auc.c
+++ b/utils/auc/src/auc.c
@@ -479,12 +479,6 @@ static void board_cb(struct ubus_request *req, int type, struct blob_attr *msg)
 
 	blobmsg_parse(board_policy, __BOARD_MAX, tb, blob_data(msg), blob_len(msg));
 
-	if (!tb[BOARD_BOARD_NAME]) {
-		fprintf(stderr, "No board name received\n");
-		rc=-ENODATA;
-		return;
-	}
-	board_name = strdup(blobmsg_get_string(tb[BOARD_BOARD_NAME]));
 
 	if (!tb[BOARD_RELEASE]) {
 		fprintf(stderr, "No release received\n");
@@ -509,6 +503,21 @@ static void board_cb(struct ubus_request *req, int type, struct blob_attr *msg)
 	version = strdup(blobmsg_get_string(rel[RELEASE_VERSION]));
 	revision = strdup(blobmsg_get_string(rel[RELEASE_REVISION]));
 
+	if (!strcmp(target, "x86/64") || !strcmp(target, "x86/generic")) {
+		/*
+		 * ugly work-around ahead:
+		 * ignore board name on generic x86 targets, as image name is always 'generic'
+		 */
+		board_name = strdup("generic");
+	} else {
+		if (!tb[BOARD_BOARD_NAME]) {
+			fprintf(stderr, "No board name received\n");
+			rc=-ENODATA;
+			return;
+		}
+		board_name = strdup(blobmsg_get_string(tb[BOARD_BOARD_NAME]));
+	}
+
 	blobmsg_add_string(buf, "distro", distribution);
 	blobmsg_add_string(buf, "target", target);
 	blobmsg_add_string(buf, "version", version);
@@ -803,6 +812,11 @@ static int server_request(const char *url, struct blob_buf *inbuf, struct blob_b
 	out_bytes = 0;
 	out_len = 0;
 
+#ifdef AUC_DEBUG
+	if (debug)
+		fprintf(stderr, "Requesting URL: %s\n", url);
+#endif
+
 	if (outbuf) {
 		jsb = malloc(sizeof(struct jsonblobber));
 		jsb->outbuf = outbuf;
@@ -1138,8 +1152,16 @@ static struct branch *select_branch(char *name, char *select_version)
 				break;
 			}
 		} else {
-			if (!abr || (strcmp(br->version, abr->version) > 0))
-				abr = br;
+			/* if we are on a snapshot branch, stay there */
+			if (strcasestr(version, "snapshot")) {
+				if (strcasestr(br->version, "snapshot")) {
+					abr = br;
+					break;
+				}
+			} else {
+				if (!abr || (verrevcmp(br->version, abr->version) > 0))
+					abr = br;
+			}
 		}
 	}
 
@@ -1340,7 +1362,7 @@ int main(int args, char *argv[]) {
 	char url[256];
 	char *sanetized_board_name, *image_name, *image_sha256, *tmp;
 	struct blob_attr *tbr[__REPLY_MAX];
-	struct blob_attr *tb[__TARGET_MAX];
+	struct blob_attr *tb[__TARGET_MAX] = {}; /* make sure tb is NULL initialized even if blobmsg_parse isn't called */
 	struct stat imgstat;
 	int check_only = 0;
 	int retry_delay = 0;
-- 
GitLab