From 8fe2ddd68717e029248aef2ea328543d60d091e5 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 5 Mar 2025 14:31:45 +0100 Subject: [PATCH 1/4] [ci,timezones] add build directory to ignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b6e21c0c8..0726b4c3c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ **/CMakeCache.txt **/CMakeFiles +build checker abi-checker From 70c175098908ffcd4176b76b20342fb866e3c220 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 5 Mar 2025 14:59:55 +0100 Subject: [PATCH 2/4] [winpr,comm] #ifdef comm ctl defines Only add a comm ctl define to the switch if it is defined. Some defines are platform specific, so only compile them when available. --- winpr/libwinpr/comm/comm.c | 144 +++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) diff --git a/winpr/libwinpr/comm/comm.c b/winpr/libwinpr/comm/comm.c index 965992b79..45f1c4acf 100644 --- a/winpr/libwinpr/comm/comm.c +++ b/winpr/libwinpr/comm/comm.c @@ -1498,150 +1498,294 @@ static const char* CommIoCtlToStr(unsigned long int io) switch (io) { #if defined(WINPR_HAVE_SERIAL_SUPPORT) +#if defined(TCGETS) case TCGETS: return "TCGETS"; +#endif +#if defined(TCSETS) case TCSETS: return "TCSETS"; +#endif +#if defined(TCSETSW) case TCSETSW: return "TCSETSW"; +#endif +#if defined(TCSETSF) case TCSETSF: return "TCSETSF"; +#endif +#if defined(TCGETA) case TCGETA: return "TCGETA"; +#endif +#if defined(TCSETA) case TCSETA: return "TCSETA"; +#endif +#if defined(TCSETAW) case TCSETAW: return "TCSETAW"; +#endif +#if defined(TCSETAF) case TCSETAF: return "TCSETAF"; +#endif +#if defined(TCSBRK) case TCSBRK: return "TCSBRK"; +#endif +#if defined(TCXONC) case TCXONC: return "TCXONC"; +#endif +#if defined(TCFLSH) case TCFLSH: return "TCFLSH"; +#endif +#if defined(TIOCEXCL) case TIOCEXCL: return "TIOCEXCL"; +#endif +#if defined(TIOCNXCL) case TIOCNXCL: return "TIOCNXCL"; +#endif +#if defined(TIOCSCTTY) case TIOCSCTTY: return "TIOCSCTTY"; +#endif +#if defined(TIOCGPGRP) case TIOCGPGRP: return "TIOCGPGRP"; +#endif +#if defined(TIOCSPGRP) case TIOCSPGRP: return "TIOCSPGRP"; +#endif +#if defined(TIOCOUTQ) case TIOCOUTQ: return "TIOCOUTQ"; +#endif +#if defined(TIOCSTI) case TIOCSTI: return "TIOCSTI"; +#endif +#if defined(TIOCGWINSZ) case TIOCGWINSZ: return "TIOCGWINSZ"; +#endif +#if defined(TIOCSWINSZ) case TIOCSWINSZ: return "TIOCSWINSZ"; +#endif +#if defined(TIOCMGET) case TIOCMGET: return "TIOCMGET"; +#endif +#if defined(TIOCMBIS) case TIOCMBIS: return "TIOCMBIS"; +#endif +#if defined(TIOCMBIC) case TIOCMBIC: return "TIOCMBIC"; +#endif +#if defined(TIOCMSET) case TIOCMSET: return "TIOCMSET"; +#endif +#if defined(TIOCGSOFTCAR) case TIOCGSOFTCAR: return "TIOCGSOFTCAR"; +#endif +#if defined(TIOCSSOFTCAR) case TIOCSSOFTCAR: return "TIOCSSOFTCAR"; +#endif +#if defined(FIONREAD) case FIONREAD: return "FIONREAD/TIOCINQ"; +#endif +#if defined(TIOCLINUX) case TIOCLINUX: return "TIOCLINUX"; +#endif +#if defined(TIOCCONS) case TIOCCONS: return "TIOCCONS"; +#endif +#if defined(TIOCGSERIAL) case TIOCGSERIAL: return "TIOCGSERIAL"; +#endif +#if defined(TIOCSSERIAL) case TIOCSSERIAL: return "TIOCSSERIAL"; +#endif +#if defined(TIOCPKT) case TIOCPKT: return "TIOCPKT"; +#endif +#if defined(FIONBIO) case FIONBIO: return "FIONBIO"; +#endif +#if defined(TIOCNOTTY) case TIOCNOTTY: return "TIOCNOTTY"; +#endif +#if defined(TIOCSETD) case TIOCSETD: return "TIOCSETD"; +#endif +#if defined(TIOCGETD) case TIOCGETD: return "TIOCGETD"; +#endif +#if defined(TCSBRKP) case TCSBRKP: return "TCSBRKP"; +#endif +#if defined(TIOCSBRK) case TIOCSBRK: return "TIOCSBRK"; +#endif +#if defined(TIOCCBRK) case TIOCCBRK: return "TIOCCBRK"; +#endif +#if defined(TIOCGSID) case TIOCGSID: return "TIOCGSID"; +#endif +#if defined(TIOCGRS485) case TIOCGRS485: return "TIOCGRS485"; +#endif +#if defined(TIOCSRS485) case TIOCSRS485: return "TIOCSRS485"; +#endif +#if defined(TIOCSPTLCK) case TIOCSPTLCK: return "TIOCSPTLCK"; +#endif +#if defined(TCGETX) case TCGETX: return "TCGETX"; +#endif +#if defined(TCSETX) case TCSETX: return "TCSETX"; +#endif +#if defined(TCSETXF) case TCSETXF: return "TCSETXF"; +#endif +#if defined(TCSETXW) case TCSETXW: return "TCSETXW"; +#endif +#if defined(TIOCSIG) case TIOCSIG: return "TIOCSIG"; +#endif +#if defined(TIOCVHANGUP) case TIOCVHANGUP: return "TIOCVHANGUP"; +#endif +#if defined(TIOCGPTPEER) case TIOCGPTPEER: return "TIOCGPTPEER"; +#endif +#if defined(FIONCLEX) case FIONCLEX: return "FIONCLEX"; +#endif +#if defined(FIOCLEX) case FIOCLEX: return "FIOCLEX"; +#endif +#if defined(FIOASYNC) case FIOASYNC: return "FIOASYNC"; +#endif +#if defined(TIOCSERCONFIG) case TIOCSERCONFIG: return "TIOCSERCONFIG"; +#endif +#if defined(TIOCSERGWILD) case TIOCSERGWILD: return "TIOCSERGWILD"; +#endif +#if defined(TIOCSERSWILD) case TIOCSERSWILD: return "TIOCSERSWILD"; +#endif +#if defined(TIOCGLCKTRMIOS) case TIOCGLCKTRMIOS: return "TIOCGLCKTRMIOS"; +#endif +#if defined(TIOCSLCKTRMIOS) case TIOCSLCKTRMIOS: return "TIOCSLCKTRMIOS"; +#endif +#if defined(TIOCSERGSTRUCT) case TIOCSERGSTRUCT: return "TIOCSERGSTRUCT"; +#endif +#if defined(TIOCSERGETLSR) case TIOCSERGETLSR: return "TIOCSERGETLSR"; +#endif +#if defined(TIOCSERGETMULTI) case TIOCSERGETMULTI: return "TIOCSERGETMULTI"; +#endif +#if defined(TIOCSERSETMULTI) case TIOCSERSETMULTI: return "TIOCSERSETMULTI"; +#endif +#if defined(TIOCMIWAIT) case TIOCMIWAIT: return "TIOCMIWAIT"; +#endif +#if defined(TIOCGICOUNT) case TIOCGICOUNT: return "TIOCGICOUNT"; +#endif +#if defined(FIOQSIZE) case FIOQSIZE: return "FIOQSIZE"; +#endif +#if defined(TIOCPKT_DATA) case TIOCPKT_DATA: return "TIOCPKT_DATA"; +#endif +#if defined(TIOCPKT_FLUSHWRITE) case TIOCPKT_FLUSHWRITE: return "TIOCPKT_FLUSHWRITE"; +#endif +#if defined(TIOCPKT_STOP) case TIOCPKT_STOP: return "TIOCPKT_STOP"; +#endif +#if defined(TIOCPKT_START) case TIOCPKT_START: return "TIOCPKT_START"; +#endif +#if defined(TIOCPKT_NOSTOP) case TIOCPKT_NOSTOP: return "TIOCPKT_NOSTOP"; +#endif +#if defined(TIOCPKT_DOSTOP) case TIOCPKT_DOSTOP: return "TIOCPKT_DOSTOP"; +#endif +#if defined(TIOCPKT_IOCTL) case TIOCPKT_IOCTL: return "TIOCPKT_IOCTL"; +#endif #endif default: return "UNKNOWN"; From 9f5a00edd838323be6ec970597264ed161514eff Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 5 Mar 2025 15:12:54 +0100 Subject: [PATCH 3/4] [warnings] fix various warnings * Log values ignored but with a defined value (previously unused) * Fix missing define guards for deprected symbols in unit tests --- libfreerdp/core/capabilities.c | 4 ++- libfreerdp/core/gcc.c | 33 +++++++++++++++---- libfreerdp/core/license.c | 5 +-- libfreerdp/core/mcs.h | 1 + libfreerdp/core/rdp.c | 31 +++++++++++------ libfreerdp/locale/test/TestLocaleKeyboard.c | 6 ++++ winpr/libwinpr/crypto/test/TestCryptoCipher.c | 13 +++++++- 7 files changed, 72 insertions(+), 21 deletions(-) diff --git a/libfreerdp/core/capabilities.c b/libfreerdp/core/capabilities.c index 1b209c137..454087452 100644 --- a/libfreerdp/core/capabilities.c +++ b/libfreerdp/core/capabilities.c @@ -4493,7 +4493,9 @@ BOOL rdp_recv_demand_active(rdpRdp* rdp, wStream* s, UINT16 pduSource, UINT16 le if (!Stream_CheckAndLogRequiredLength(TAG, s, 4)) return FALSE; - const UINT32 SessionId = Stream_Get_UINT32(s); /* SessionId */ + /* [MS-RDPBCGR] 2.2.1.13.1.1 Demand Active PDU Data (TS_DEMAND_ACTIVE_PDU)::sessionId + * is ignored by client */ + Stream_Seek_UINT32(s); /* SessionId */ { rdp_secondary_update_internal* secondary = secondary_update_cast(rdp->update->secondary); diff --git a/libfreerdp/core/gcc.c b/libfreerdp/core/gcc.c index 3d2341365..043e9862f 100644 --- a/libfreerdp/core/gcc.c +++ b/libfreerdp/core/gcc.c @@ -1210,7 +1210,6 @@ BOOL gcc_read_client_core_data(wStream* s, rdpMcs* mcs) do { - UINT16 clientProductIdLen = 0; if (blockLength < 2) break; @@ -1220,15 +1219,37 @@ BOOL gcc_read_client_core_data(wStream* s, rdpMcs* mcs) if (blockLength < 2) break; - Stream_Read_UINT16(s, clientProductIdLen); /* clientProductID (2 bytes) */ + const UINT16 clientProductId = Stream_Get_UINT16(s); /* clientProductID (2 bytes) */ blockLength -= 2; + /* [MS-RDPBCGR] 2.2.1.3.2 Client Core Data (TS_UD_CS_CORE)::clientProductId (optional) + * should be initialized to 1 + */ + if (clientProductId != 1) + { + WLog_WARN(TAG, + "[MS-RDPBCGR] 2.2.1.3.2 Client Core Data (TS_UD_CS_CORE)::clientProductId " + "(optional) expected 1, got %" PRIu32, + clientProductId); + } + if (blockLength < 4) break; - Stream_Seek_UINT32(s); /* serialNumber (4 bytes) */ + const UINT32 serialNumber = Stream_Get_UINT32(s); /* serialNumber (4 bytes) */ blockLength -= 4; + /* [MS-RDPBCGR] 2.2.1.3.2 Client Core Data (TS_UD_CS_CORE)::serialNumber (optional) + * should be initialized to 0 + */ + if (serialNumber != 0) + { + WLog_WARN(TAG, + "[MS-RDPBCGR] 2.2.1.3.2 Client Core Data (TS_UD_CS_CORE)::serialNumber " + "(optional) expected 0, got %" PRIu32, + serialNumber); + } + if (blockLength < 2) break; @@ -1925,16 +1946,14 @@ BOOL gcc_write_client_network_data(wStream* s, const rdpMcs* mcs) BOOL gcc_read_server_network_data(wStream* s, rdpMcs* mcs) { UINT16 channelId = 0; - UINT16 MCSChannelId = 0; - UINT16 channelCount = 0; UINT32 parsedChannelCount = 0; WINPR_ASSERT(s); WINPR_ASSERT(mcs); if (!Stream_CheckAndLogRequiredLength(TAG, s, 4)) return FALSE; - Stream_Read_UINT16(s, MCSChannelId); /* MCSChannelId */ - Stream_Read_UINT16(s, channelCount); /* channelCount */ + mcs->IOChannelId = Stream_Get_UINT16(s); /* MCSChannelId */ + const uint16_t channelCount = Stream_Get_UINT16(s); /* channelCount */ parsedChannelCount = channelCount; if (channelCount != mcs->channelCount) diff --git a/libfreerdp/core/license.c b/libfreerdp/core/license.c index e5be3fdac..5319e9db7 100644 --- a/libfreerdp/core/license.c +++ b/libfreerdp/core/license.c @@ -1950,7 +1950,6 @@ fail: BOOL license_read_platform_challenge_packet(rdpLicense* license, wStream* s) { BYTE macData[LICENSING_ENCRYPTION_KEY_LENGTH] = { 0 }; - UINT32 ConnectFlags = 0; WINPR_ASSERT(license); @@ -1959,7 +1958,9 @@ BOOL license_read_platform_challenge_packet(rdpLicense* license, wStream* s) if (!license_check_stream_length(s, 4, "license platform challenge")) return FALSE; - Stream_Read_UINT32(s, ConnectFlags); /* ConnectFlags, Reserved (4 bytes) */ + /* [MS-RDPELE] 2.2.2.4 Server Platform Challenge (SERVER_PLATFORM_CHALLENGE) + * reserved field */ + Stream_Seek_UINT32(s); /* ConnectFlags, Reserved (4 bytes) */ /* EncryptedPlatformChallenge */ license->EncryptedPlatformChallenge->type = BB_ANY_BLOB; diff --git a/libfreerdp/core/mcs.h b/libfreerdp/core/mcs.h index 38859bcd0..6745215a6 100644 --- a/libfreerdp/core/mcs.h +++ b/libfreerdp/core/mcs.h @@ -131,6 +131,7 @@ struct rdp_mcs UINT16 userId; UINT16 baseChannelId; + UINT16 IOChannelId; UINT16 messageChannelId; UINT32 flags; diff --git a/libfreerdp/core/rdp.c b/libfreerdp/core/rdp.c index c51d53043..ac640cb2b 100644 --- a/libfreerdp/core/rdp.c +++ b/libfreerdp/core/rdp.c @@ -643,7 +643,8 @@ BOOL rdp_read_header(rdpRdp* rdp, wStream* s, UINT16* length, UINT16* channelId) if (!per_read_integer16(s, channelId, 0)) /* channelId */ return FALSE; - const uint8_t byte = Stream_Get_UINT8(s); /* dataPriority + Segmentation (0x70) */ + const uint8_t dataPriority = Stream_Get_UINT8(s); /* dataPriority + Segmentation (0x70) */ + WLog_Print(rdp->log, WLOG_TRACE, "dataPriority=%" PRIu8, dataPriority); if (!per_read_length(s, length)) /* userData (OCTET_STRING) */ return FALSE; @@ -991,27 +992,37 @@ static BOOL rdp_recv_server_set_keyboard_indicators_pdu(rdpRdp* rdp, wStream* s) return FALSE; const uint16_t unitId = Stream_Get_UINT16(s); /* unitId (2 bytes) */ + if (unitId != 0) + { + WLog_Print(rdp->log, WLOG_WARN, + "[MS-RDPBCGR] 2.2.8.2.1.1 Set Keyboard Indicators PDU Data " + "(TS_SET_KEYBOARD_INDICATORS_PDU)::unitId should be 0, is %" PRIu8, + unitId); + } const UINT16 ledFlags = Stream_Get_UINT16(s); /* ledFlags (2 bytes) */ return IFCALLRESULT(TRUE, context->update->SetKeyboardIndicators, context, ledFlags); } static BOOL rdp_recv_server_set_keyboard_ime_status_pdu(rdpRdp* rdp, wStream* s) { - UINT16 unitId = 0; - UINT32 imeState = 0; - UINT32 imeConvMode = 0; - if (!rdp || !rdp->input) return FALSE; if (!Stream_CheckAndLogRequiredLengthWLog(rdp->log, s, 10)) return FALSE; - Stream_Read_UINT16(s, unitId); /* unitId (2 bytes) */ - Stream_Read_UINT32(s, imeState); /* imeState (4 bytes) */ - Stream_Read_UINT32(s, imeConvMode); /* imeConvMode (4 bytes) */ - IFCALL(rdp->update->SetKeyboardImeStatus, rdp->context, unitId, imeState, imeConvMode); - return TRUE; + const uint16_t unitId = Stream_Get_UINT16(s); /* unitId (2 bytes) */ + if (unitId != 0) + { + WLog_Print(rdp->log, WLOG_WARN, + "[MS-RDPBCGR] 2.2.8.2.2.1 Set Keyboard IME Status PDU Data " + "(TS_SET_KEYBOARD_IME_STATUS_PDU)::unitId should be 0, is %" PRIu8, + unitId); + } + const uint32_t imeState = Stream_Get_UINT32(s); /* imeState (4 bytes) */ + const uint32_t imeConvMode = Stream_Get_UINT32(s); /* imeConvMode (4 bytes) */ + return IFCALLRESULT(TRUE, rdp->update->SetKeyboardImeStatus, rdp->context, unitId, imeState, + imeConvMode); } static BOOL rdp_recv_set_error_info_data_pdu(rdpRdp* rdp, wStream* s) diff --git a/libfreerdp/locale/test/TestLocaleKeyboard.c b/libfreerdp/locale/test/TestLocaleKeyboard.c index 8da784f5d..aff2639d8 100644 --- a/libfreerdp/locale/test/TestLocaleKeyboard.c +++ b/libfreerdp/locale/test/TestLocaleKeyboard.c @@ -248,6 +248,7 @@ static DWORD get_random(DWORD offset) return x; } +#if defined(WITH_FREERDP_3x_DEPRECATED) static BOOL test_scancode_cnv(void) { for (DWORD x = 0; x < UINT8_MAX; x++) @@ -283,6 +284,7 @@ static BOOL test_scancode_cnv(void) } return TRUE; } +#endif static BOOL test_codepages(void) { @@ -325,6 +327,7 @@ static BOOL test_codepages(void) static BOOL test_init(void) { +#if defined(WITH_FREERDP_3x_DEPRECATED) const DWORD kbd = freerdp_keyboard_init(0); if (kbd == 0) { @@ -352,6 +355,7 @@ static BOOL test_init(void) // TODO: Test with valid remap list // TODO: Test with invalid remap list // TODO: Test with defaults != 0 +#endif return TRUE; } @@ -382,8 +386,10 @@ int TestLocaleKeyboard(int argc, char* argv[]) ~(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_VARIANT | RDP_KEYBOARD_LAYOUT_TYPE_IME))) return -1; +#if defined(WITH_FREERDP_3x_DEPRECATED) if (!test_scancode_cnv()) return -1; +#endif if (!test_codepages()) return -1; if (!test_init()) diff --git a/winpr/libwinpr/crypto/test/TestCryptoCipher.c b/winpr/libwinpr/crypto/test/TestCryptoCipher.c index afa661ddc..9aa0afdc5 100644 --- a/winpr/libwinpr/crypto/test/TestCryptoCipher.c +++ b/winpr/libwinpr/crypto/test/TestCryptoCipher.c @@ -23,8 +23,10 @@ static BOOL test_crypto_cipher_aes_128_cbc(BOOL ex) if (ex) ctx = winpr_Cipher_NewEx(WINPR_CIPHER_AES_128_CBC, WINPR_ENCRYPT, key, sizeof(key), iv, sizeof(iv)); +#if defined(WITH_FREERDP_3x_DEPRECATED) else ctx = winpr_Cipher_New(WINPR_CIPHER_AES_128_CBC, WINPR_ENCRYPT, key, iv); +#endif if (!ctx) { (void)fprintf(stderr, "%s: winpr_Cipher_New (encrypt) failed\n", __func__); @@ -60,10 +62,19 @@ static BOOL test_crypto_cipher_aes_128_cbc(BOOL ex) } winpr_Cipher_Free(ctx); + ctx = NULL; /* decrypt */ - if (!(ctx = winpr_Cipher_New(WINPR_CIPHER_AES_128_CBC, WINPR_DECRYPT, key, iv))) + if (ex) + ctx = winpr_Cipher_NewEx(WINPR_CIPHER_AES_128_CBC, WINPR_DECRYPT, key, sizeof(key), iv, + sizeof(iv)); +#if defined(WITH_FREERDP_3x_DEPRECATED) + else + ctx = winpr_Cipher_New(WINPR_CIPHER_AES_128_CBC, WINPR_DECRYPT, key, iv); + +#endif + if (!ctx) { (void)fprintf(stderr, "%s: winpr_Cipher_New (decrypt) failed\n", __func__); return FALSE; From 69d0238d2e8f031a535d392be77ac51f81fcb52e Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 5 Mar 2025 15:55:22 +0100 Subject: [PATCH 4/4] [ci,alt-arch] update uraimo/run-on-arch-action to v3.0.0 --- .github/workflows/alt-architectures.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/alt-architectures.yml b/.github/workflows/alt-architectures.yml index c2270915e..ecb829ca2 100644 --- a/.github/workflows/alt-architectures.yml +++ b/.github/workflows/alt-architectures.yml @@ -27,7 +27,7 @@ jobs: distro: ubuntu22.04 steps: - uses: actions/checkout@v4 - - uses: uraimo/run-on-arch-action@v2.8.1 + - uses: uraimo/run-on-arch-action@v3.0.0 name: "Run tests" id: build with: