<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -106,11 +106,16 @@ module ActiveRecord
       #  SELECT * FROM suppliers LIMIT 10 OFFSET 50
       def add_limit_offset!(sql, options)
         if limit = options[:limit]
-          sql &lt;&lt; &quot; LIMIT #{limit}&quot;
+          sql &lt;&lt; &quot; LIMIT #{sanitize_limit(limit)}&quot;
           if offset = options[:offset]
-            sql &lt;&lt; &quot; OFFSET #{offset}&quot;
+            sql &lt;&lt; &quot; OFFSET #{offset.to_i}&quot;
           end
         end
+        sql
+      end
+
+      def sanitize_limit(limit)
+        limit.to_s[/,/] ? limit.split(',').map{ |i| i.to_i }.join(',') : limit.to_i
       end
 
       # Appends a locking clause to an SQL statement.</diff>
      <filename>activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb</filename>
    </modified>
    <modified>
      <diff>@@ -318,10 +318,11 @@ module ActiveRecord
 
       def add_limit_offset!(sql, options) #:nodoc:
         if limit = options[:limit]
+          limit = sanitize_limit(limit)
           unless offset = options[:offset]
             sql &lt;&lt; &quot; LIMIT #{limit}&quot;
           else
-            sql &lt;&lt; &quot; LIMIT #{offset}, #{limit}&quot;
+            sql &lt;&lt; &quot; LIMIT #{offset.to_i}, #{limit}&quot;
           end
         end
       end</diff>
      <filename>activerecord/lib/active_record/connection_adapters/mysql_adapter.rb</filename>
    </modified>
    <modified>
      <diff>@@ -103,4 +103,24 @@ class AdapterTest &lt; Test::Unit::TestCase
     end
   end
 
+  def test_add_limit_offset_should_sanitize_sql_injection_for_limit_without_comas
+    sql_inject = &quot;1 select * from schema&quot;
+      assert_equal &quot; LIMIT 1&quot;, @connection.add_limit_offset!(&quot;&quot;, :limit=&gt;sql_inject)
+    if current_adapter?(:MysqlAdapter)
+      assert_equal &quot; LIMIT 7, 1&quot;, @connection.add_limit_offset!(&quot;&quot;, :limit=&gt;sql_inject, :offset=&gt;7)
+    else
+      assert_equal &quot; LIMIT 1 OFFSET 7&quot;, @connection.add_limit_offset!(&quot;&quot;, :limit=&gt;sql_inject, :offset=&gt;7)
+    end
+  end
+
+  def test_add_limit_offset_should_sanitize_sql_injection_for_limit_with_comas
+    sql_inject = &quot;1, 7 procedure help()&quot;
+    if current_adapter?(:MysqlAdapter)
+      assert_equal &quot; LIMIT 1,7&quot;, @connection.add_limit_offset!(&quot;&quot;, :limit=&gt;sql_inject)
+      assert_equal &quot; LIMIT 7, 1&quot;, @connection.add_limit_offset!(&quot;&quot;, :limit=&gt; '1 ; DROP TABLE USERS', :offset=&gt;7)
+    else
+      assert_equal &quot; LIMIT 1,7&quot;, @connection.add_limit_offset!(&quot;&quot;, :limit=&gt;sql_inject)
+      assert_equal &quot; LIMIT 1,7 OFFSET 7&quot;, @connection.add_limit_offset!(&quot;&quot;, :limit=&gt;sql_inject, :offset=&gt;7)
+    end
+  end
 end</diff>
      <filename>activerecord/test/adapter_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>760d525a3afc3b03d6246120c0db47d4a98b784d</id>
    </parent>
  </parents>
  <author>
    <name>Jon Leighton</name>
    <email>j@jonathanleighton.com</email>
  </author>
  <url>http://github.com/rails/rails/commit/213f31513e4cb640fa3ed45f387f221401023646</url>
  <id>213f31513e4cb640fa3ed45f387f221401023646</id>
  <committed-date>2008-09-23T08:07:28-07:00</committed-date>
  <authored-date>2008-09-04T09:41:49-07:00</authored-date>
  <message>Backport offset/limit SQL injection fix to 2-0-stable

Signed-off-by: Michael Koziarski &lt;michael@koziarski.com&gt;</message>
  <tree>8dc0e69f85087d82f702120747040dad64b5365a</tree>
  <committer>
    <name>Michael Koziarski</name>
    <email>michael@koziarski.com</email>
  </committer>
</commit>
