Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package hyper-v for openSUSE:Factory checked 
in at 2025-07-22 12:54:00
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/hyper-v (Old)
 and      /work/SRC/openSUSE:Factory/.hyper-v.new.8875 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "hyper-v"

Tue Jul 22 12:54:00 2025 rev:49 rq:1294750 version:9

Changes:
--------
--- /work/SRC/openSUSE:Factory/hyper-v/hyper-v.changes  2025-06-20 
16:48:54.847032591 +0200
+++ /work/SRC/openSUSE:Factory/.hyper-v.new.8875/hyper-v.changes        
2025-07-22 12:54:13.620873385 +0200
@@ -1,0 +2,6 @@
+Sun Jul 20 20:20:20 UTC 2025 - oher...@suse.de
+
+- fcopy: Fix irregularities with size of ring buffer (a4131a50)
+- fcopy: Fix incorrect file path conversion (0d86a8d6)
+
+-------------------------------------------------------------------

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ hyper-v.tools.hv.hv_fcopy_uio_daemon.c ++++++
--- /var/tmp/diff_new_pack.FcJPth/_old  2025-07-22 12:54:14.652916360 +0200
+++ /var/tmp/diff_new_pack.FcJPth/_new  2025-07-22 12:54:14.656916527 +0200
@@ -35,7 +35,10 @@
 #define WIN8_SRV_MINOR         1
 #define WIN8_SRV_VERSION       (WIN8_SRV_MAJOR << 16 | WIN8_SRV_MINOR)
 
-#define FCOPY_UIO              
"/sys/bus/vmbus/devices/eb765408-105f-49b6-b4aa-c123b64d17d4/uio"
+#define FCOPY_DEVICE_PATH(subdir) \
+       "/sys/bus/vmbus/devices/eb765408-105f-49b6-b4aa-c123b64d17d4/" #subdir
+#define FCOPY_UIO_PATH          FCOPY_DEVICE_PATH(uio)
+#define FCOPY_CHANNELS_PATH     FCOPY_DEVICE_PATH(channels)
 
 #define FCOPY_VER_COUNT                1
 static const int fcopy_versions[] = {
@@ -47,9 +50,62 @@
        UTIL_FW_VERSION
 };
 
-#define HV_RING_SIZE           0x4000 /* 16KB ring buffer size */
+static uint32_t get_ring_buffer_size(void)
+{
+       char ring_path[PATH_MAX];
+       DIR *dir;
+       struct dirent *entry;
+       struct stat st;
+       uint32_t ring_size = 0;
+       int retry_count = 0;
+
+       /* Find the channel directory */
+       dir = opendir(FCOPY_CHANNELS_PATH);
+       if (!dir) {
+               usleep(100 * 1000); /* Avoid race with kernel, wait 100ms and 
retry once */
+               dir = opendir(FCOPY_CHANNELS_PATH);
+               if (!dir) {
+                       syslog(LOG_ERR, "Failed to open channels directory: 
%s", strerror(errno));
+                       return 0;
+               }
+       }
+
+retry_once:
+       while ((entry = readdir(dir)) != NULL) {
+               if (entry->d_type == DT_DIR && strcmp(entry->d_name, ".") != 0 
&&
+                   strcmp(entry->d_name, "..") != 0) {
+                       snprintf(ring_path, sizeof(ring_path), "%s/%s/ring",
+                                FCOPY_CHANNELS_PATH, entry->d_name);
+
+                       if (stat(ring_path, &st) == 0) {
+                               /*
+                                * stat returns size of Tx, Rx rings combined,
+                                * so take half of it for individual ring size.
+                                */
+                               ring_size = (uint32_t)st.st_size / 2;
+                               syslog(LOG_INFO, "Ring buffer size from %s: %u 
bytes",
+                                      ring_path, ring_size);
+                               break;
+                       }
+               }
+       }
+
+       if (!ring_size && retry_count == 0) {
+               retry_count = 1;
+               rewinddir(dir);
+               usleep(100 * 1000); /* Wait 100ms and retry once */
+               goto retry_once;
+       }
+
+       closedir(dir);
+
+       if (!ring_size)
+               syslog(LOG_ERR, "Could not determine ring size");
 
-static unsigned char desc[HV_RING_SIZE];
+       return ring_size;
+}
+
+static unsigned char *desc;
 
 static int target_fd;
 static char target_fname[PATH_MAX];
@@ -62,8 +118,11 @@
 
        filesize = 0;
        p = path_name;
-       snprintf(target_fname, sizeof(target_fname), "%s/%s",
-                path_name, file_name);
+       if (snprintf(target_fname, sizeof(target_fname), "%s/%s",
+                    path_name, file_name) >= sizeof(target_fname)) {
+               syslog(LOG_ERR, "target file name is too long: %s/%s", 
path_name, file_name);
+               goto done;
+       }
 
        /*
         * Check to see if the path is already in place; if not,
@@ -270,7 +329,7 @@
 {
        size_t len = 0;
 
-       while (len < dest_size) {
+       while (len < dest_size && *src) {
                if (src[len] < 0x80)
                        dest[len++] = (char)(*src++);
                else
@@ -282,27 +341,15 @@
 
 static int hv_fcopy_start(struct hv_start_fcopy *smsg_in)
 {
-       setlocale(LC_ALL, "en_US.utf8");
-       size_t file_size, path_size;
-       char *file_name, *path_name;
-       char *in_file_name = (char *)smsg_in->file_name;
-       char *in_path_name = (char *)smsg_in->path_name;
-
-       file_size = wcstombs(NULL, (const wchar_t *restrict)in_file_name, 0) + 
1;
-       path_size = wcstombs(NULL, (const wchar_t *restrict)in_path_name, 0) + 
1;
-
-       file_name = (char *)malloc(file_size * sizeof(char));
-       path_name = (char *)malloc(path_size * sizeof(char));
-
-       if (!file_name || !path_name) {
-               free(file_name);
-               free(path_name);
-               syslog(LOG_ERR, "Can't allocate memory for file name and/or 
path name");
-               return HV_E_FAIL;
-       }
+       /*
+        * file_name and path_name should have same length with appropriate
+        * member of hv_start_fcopy.
+        */
+       char file_name[W_MAX_PATH], path_name[W_MAX_PATH];
 
-       wcstoutf8(file_name, (__u16 *)in_file_name, file_size);
-       wcstoutf8(path_name, (__u16 *)in_path_name, path_size);
+       setlocale(LC_ALL, "en_US.utf8");
+       wcstoutf8(file_name, smsg_in->file_name, W_MAX_PATH - 1);
+       wcstoutf8(path_name, smsg_in->path_name, W_MAX_PATH - 1);
 
        return hv_fcopy_create_file(file_name, path_name, smsg_in->copy_flags);
 }
@@ -406,7 +453,7 @@
        int daemonize = 1, long_index = 0, opt, ret = -EINVAL;
        struct vmbus_br txbr, rxbr;
        void *ring;
-       uint32_t len = HV_RING_SIZE;
+       uint32_t ring_size, len;
        char uio_name[NAME_MAX] = {0};
        char uio_dev_path[PATH_MAX] = {0};
 
@@ -437,7 +484,20 @@
        openlog("HV_UIO_FCOPY", 0, LOG_USER);
        syslog(LOG_INFO, "starting; pid is:%d", getpid());
 
-       fcopy_get_first_folder(FCOPY_UIO, uio_name);
+       ring_size = get_ring_buffer_size();
+       if (!ring_size) {
+               ret = -ENODEV;
+               goto exit;
+       }
+
+       desc = malloc(ring_size * sizeof(unsigned char));
+       if (!desc) {
+               syslog(LOG_ERR, "malloc failed for desc buffer");
+               ret = -ENOMEM;
+               goto exit;
+       }
+
+       fcopy_get_first_folder(FCOPY_UIO_PATH, uio_name);
        snprintf(uio_dev_path, sizeof(uio_dev_path), "/dev/%s", uio_name);
        fcopy_fd = open(uio_dev_path, O_RDWR);
 
@@ -445,17 +505,17 @@
                syslog(LOG_ERR, "open %s failed; error: %d %s",
                       uio_dev_path, errno, strerror(errno));
                ret = fcopy_fd;
-               goto exit;
+               goto free_desc;
        }
 
-       ring = vmbus_uio_map(&fcopy_fd, HV_RING_SIZE);
+       ring = vmbus_uio_map(&fcopy_fd, ring_size);
        if (!ring) {
                ret = errno;
                syslog(LOG_ERR, "mmap ringbuffer failed; error: %d %s", ret, 
strerror(ret));
                goto close;
        }
-       vmbus_br_setup(&txbr, ring, HV_RING_SIZE);
-       vmbus_br_setup(&rxbr, (char *)ring + HV_RING_SIZE, HV_RING_SIZE);
+       vmbus_br_setup(&txbr, ring, ring_size);
+       vmbus_br_setup(&rxbr, (char *)ring + ring_size, ring_size);
 
        rxbr.vbr->imask = 0;
 
@@ -472,7 +532,7 @@
                        goto close;
                }
 
-               len = HV_RING_SIZE;
+               len = ring_size;
                ret = rte_vmbus_chan_recv_raw(&rxbr, desc, &len);
                if (unlikely(ret <= 0)) {
                        /* This indicates a failure to communicate (or worse) */
@@ -492,6 +552,8 @@
        }
 close:
        close(fcopy_fd);
+free_desc:
+       free(desc);
 exit:
        return ret;
 }

Reply via email to