Commit 861fef87 authored by Frédéric Buclin's avatar Frédéric Buclin

Bug 583690: (CVE-2010-2759) [SECURITY][PostgreSQL] Bugzilla crashes when viewing…

Bug 583690: (CVE-2010-2759) [SECURITY][PostgreSQL] Bugzilla crashes when viewing a bug if a comment contains 'bug <num>' or 'attachment <num>' where <num> is greater than the max allowed integer r=mkanat a=LpSolit
parent 2ea4b3d3
...@@ -170,6 +170,7 @@ use Memoize; ...@@ -170,6 +170,7 @@ use Memoize;
MIN_SMALLINT MIN_SMALLINT
MAX_SMALLINT MAX_SMALLINT
MAX_INT_32
MAX_LEN_QUERY_NAME MAX_LEN_QUERY_NAME
MAX_CLASSIFICATION_SIZE MAX_CLASSIFICATION_SIZE
...@@ -513,6 +514,7 @@ use constant ROOT_USER => ON_WINDOWS ? 'Administrator' : 'root'; ...@@ -513,6 +514,7 @@ use constant ROOT_USER => ON_WINDOWS ? 'Administrator' : 'root';
use constant MIN_SMALLINT => -32768; use constant MIN_SMALLINT => -32768;
use constant MAX_SMALLINT => 32767; use constant MAX_SMALLINT => 32767;
use constant MAX_INT_32 => 2147483647;
# The longest that a saved search name can be. # The longest that a saved search name can be.
use constant MAX_LEN_QUERY_NAME => 64; use constant MAX_LEN_QUERY_NAME => 64;
......
...@@ -87,6 +87,9 @@ sub _init { ...@@ -87,6 +87,9 @@ sub _init {
|| ThrowCodeError('param_must_be_numeric', || ThrowCodeError('param_must_be_numeric',
{function => $class . '::_init'}); {function => $class . '::_init'});
# Too large integers make PostgreSQL crash.
return if $id > MAX_INT_32;
$object = $dbh->selectrow_hashref(qq{ $object = $dbh->selectrow_hashref(qq{
SELECT $columns FROM $table SELECT $columns FROM $table
WHERE $id_field = ?}, undef, $id); WHERE $id_field = ?}, undef, $id);
...@@ -165,6 +168,8 @@ sub new_from_list { ...@@ -165,6 +168,8 @@ sub new_from_list {
detaint_natural($id) || detaint_natural($id) ||
ThrowCodeError('param_must_be_numeric', ThrowCodeError('param_must_be_numeric',
{function => $class . '::new_from_list'}); {function => $class . '::new_from_list'});
# Too large integers make PostgreSQL crash.
next if $id > MAX_INT_32;
push(@detainted_ids, $id); push(@detainted_ids, $id);
} }
# We don't do $invocant->match because some classes have # We don't do $invocant->match because some classes have
......
...@@ -268,21 +268,15 @@ sub get_attachment_link { ...@@ -268,21 +268,15 @@ sub get_attachment_link {
my ($attachid, $link_text) = @_; my ($attachid, $link_text) = @_;
my $dbh = Bugzilla->dbh; my $dbh = Bugzilla->dbh;
detaint_natural($attachid) my $attachment = new Bugzilla::Attachment($attachid);
|| die "get_attachment_link() called with non-integer attachment number";
my ($bugid, $isobsolete, $desc, $is_patch) = if ($attachment) {
$dbh->selectrow_array('SELECT bug_id, isobsolete, description, ispatch
FROM attachments WHERE attach_id = ?',
undef, $attachid);
if ($bugid) {
my $title = ""; my $title = "";
my $className = ""; my $className = "";
if (Bugzilla->user->can_see_bug($bugid)) { if (Bugzilla->user->can_see_bug($attachment->bug_id)) {
$title = $desc; $title = $attachment->description;
} }
if ($isobsolete) { if ($attachment->isobsolete) {
$className = "bz_obsolete"; $className = "bz_obsolete";
} }
# Prevent code injection in the title. # Prevent code injection in the title.
...@@ -294,7 +288,7 @@ sub get_attachment_link { ...@@ -294,7 +288,7 @@ sub get_attachment_link {
# If the attachment is a patch, try to link to the diff rather # If the attachment is a patch, try to link to the diff rather
# than the text, by default. # than the text, by default.
my $patchlink = ""; my $patchlink = "";
if ($is_patch and Bugzilla->feature('patch_viewer')) { if ($attachment->ispatch and Bugzilla->feature('patch_viewer')) {
$patchlink = '&amp;action=diff'; $patchlink = '&amp;action=diff';
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment