vikrantpuppala opened a new issue, #50852:
URL: https://github.com/apache/arrow/issues/50852

   ### Describe the bug, including details regarding any error messages, 
version, and platform.
   
   In the Arrow Flight SQL ODBC driver, `ODBCConnection::SetConnectAttr` decodes
   the `SQL_ATTR_CURRENT_CATALOG` value with the *wrong* string decoder when the
   call arrives through a wide (Unicode / `*W`) entry point.
   
   ```cpp
   // odbc_impl/odbc_connection.cc
   case SQL_ATTR_CURRENT_CATALOG: {
     std::string catalog;
     if (is_unicode) {
       SetAttributeUTF8(value, string_length, catalog);      // <-- wrong
     } else {
       SetAttributeSQLWCHAR(value, string_length, catalog);  // <-- wrong
     }
     ...
   ```
   
   `is_unicode` selects the buffer **width**, not "needs conversion":
   
   - A unicode (`SQLSetConnectAttrW`) call hands over a **wide `SQLWCHAR` 
buffer**
     and must be decoded with `SetAttributeSQLWCHAR`.
   - A non-unicode (`SQLSetConnectAttrA`) call hands over a **byte string** and 
is
     decoded with `SetAttributeUTF8`.
   
   The two branches are swapped. When a wide catalog name is decoded with the
   byte-wise `SetAttributeUTF8`, the wide buffer is misread: with a 
null-terminated
   (`SQL_NTS`) length it is truncated at the first embedded NUL of the wide
   encoding (e.g. UTF-16 `"odbc"` → `"o"`); with an explicit length it is stored
   raw, embedded NULs and all (UTF-16 `"my_catalog"` →
   `"m\0y\0_\0c\0a\0t\0a\0l\0o\0g\0"`). Either way the stored catalog is wrong.
   
   The correct mapping is already established by the getter side: 
`GetStringAttribute`
   (in `attribute_utils.h`) maps `is_unicode == true` to `GetAttributeSQLWCHAR`.
   The setter for `SQL_ATTR_CURRENT_CATALOG` inverts it.
   
   The same class of bug exists in `ODBCDescriptor::SetField` for 
`SQL_DESC_NAME`,
   which unconditionally uses the byte-wise `SetAttributeUTF8` even though the
   matching getter (`GetField` / `SQL_DESC_NAME`) reads the field back with
   `GetAttributeSQLWCHAR` — so the field is stored wide-origin but decoded
   byte-wise on the way in.
   
   **Impact:** an application that sets a multi-character catalog through the
   wide entry point gets a corrupted catalog name back, so subsequent catalog
   scoping operates on the wrong (or a non-existent) catalog.
   
   **Introduced by:**
   - `SQL_ATTR_CURRENT_CATALOG`: swapped from the start in the original driver
     import, GH-46522 (#40939). The getter was written against the shared
     `GetStringAttribute` helper (correct); the setter open-coded the branch 
inline
     and inverted it.
   - `SQL_DESC_NAME`: originally consistent (getter and setter both byte-wise);
     GH-47721 (#48050) migrated the descriptor string getters to wide
     `GetAttributeSQLWCHAR` but left this setter byte-wise.
   
   ### Component(s)
   
   C++, FlightRPC


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to