| Bug #16627 | "Index and length must refer to a location within the string." when executing c | ||
|---|---|---|---|
| Submitted: | 19 Jan 2006 10:49 | Modified: | 13 Apr 2006 10:49 |
| Reporter: | Christian Romberg | Email Updates: | |
| Status: | No Feedback | Impact on me: | |
| Category: | Connector / NET | Severity: | S1 (Critical) |
| Version: | 1.0.7 | OS: | |
| Assigned to: | Assigned Account | CPU Architecture: | Any |
[13 Mar 2006 10:12]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/3762
[13 Apr 2006 23:00]
Bugs System
No feedback was provided for this bug for over a month, so it is being suspended automatically. If you are able to provide the information that was originally requested, please do so and change the status of the bug back to "Open".

Description: I've encountered a bug, that an exception "Index and length must refer to a location within the string." occured when executing a command. The offending line is in MySqlString.cs: if (length > 0) v = v.Substring(0, length); where the check is missing whether "length" actually exceeds the length of "v". This is the case in my scenario, because I'm using Prepare() and length is set to 255, although the actual passed string sometimes is shorter. Please note, I consider this a serious bug, because it seems, that the Prepare() functionality is not usable at all. When I prepare a statement, then I configure the length to some fixed value (e.g. 255) and the strings actually passed might be shorter. When I reuse the statement (thats the reason for me to prepare them) I don't reset the length. How to repeat: Define a string parameter with a length of 255, prepare the command, execute the command with a string shorter then 255 Suggested fix: change MySqlString::Serialize as follows: internal override void Serialize(PacketWriter writer, bool binary, object value, int length) { string v = value.ToString(); if (length > 0 && v.Length > length) v = v.Substring(0, length); if (binary) writer.WriteLenString( v ); else writer.WriteStringNoNull( "'" + EscapeString(v) + "'" ); }