Github user necouchman commented on a diff in the pull request:

    https://github.com/apache/guacamole-server/pull/154#discussion_r178701688
  
    --- Diff: src/protocols/rdp/guac_rdpdr/rdpdr_printer.c ---
    @@ -141,18 +143,25 @@ static void 
guac_rdpdr_device_printer_announce_handler(guac_rdpdr_device* device
         Stream_Write(output_stream, "PRN1\0\0\0\0", 8); /* DOS name */
     
         /* Printer data */
    -    Stream_Write_UINT32(output_stream, 24 + GUAC_PRINTER_DRIVER_LENGTH + 
GUAC_PRINTER_NAME_LENGTH);
    +    int settings_length = guac_utf8_strlen(device->device_name);
    +    int printer_name_length = (settings_length + 1) * 2;
    +    char* printer_name = malloc(printer_name_length);
    +    guac_rdp_utf8_to_utf16((const unsigned char*)device->device_name, 
    +            settings_length, printer_name, printer_name_length);
    +    printer_name[printer_name_length - 2] = '\0';
    +    printer_name[printer_name_length - 1] = '\0';
    +    Stream_Write_UINT32(output_stream, 24 + GUAC_PRINTER_DRIVER_LENGTH + 
printer_name_length);
         Stream_Write_UINT32(output_stream,
                   RDPDR_PRINTER_ANNOUNCE_FLAG_DEFAULTPRINTER
                 | RDPDR_PRINTER_ANNOUNCE_FLAG_NETWORKPRINTER);
         Stream_Write_UINT32(output_stream, 0); /* reserved - must be 0 */
         Stream_Write_UINT32(output_stream, 0); /* PnPName length (PnPName is 
ultimately ignored) */
         Stream_Write_UINT32(output_stream, GUAC_PRINTER_DRIVER_LENGTH); /* 
DriverName length */
    -    Stream_Write_UINT32(output_stream, GUAC_PRINTER_NAME_LENGTH);   /* 
PrinterName length */
    +    Stream_Write_UINT32(output_stream, printer_name_length);   /* 
PrinterName length */
         Stream_Write_UINT32(output_stream, 0);                          /* 
CachedFields length */
     
         Stream_Write(output_stream, GUAC_PRINTER_DRIVER, 
GUAC_PRINTER_DRIVER_LENGTH);
    -    Stream_Write(output_stream, GUAC_PRINTER_NAME,   
GUAC_PRINTER_NAME_LENGTH);
    +    Stream_Write(output_stream, printer_name, printer_name_length);
    --- End diff --
    
    Well, I've taken a stab at the implementation of this, as seen in the 
latest commit.  It feels far, far away from anywhere near good at this point, 
but you can take a look and let me know if I'm on the right track and make 
suggestions.  The whole double loop thing just feels wrong, but I'm not sure 
how else to get the number of bytes before opening the stream and then actually 
write the stream data.


---

Reply via email to