2007/12/13, Malcolm <[EMAIL PROTECTED]>:
>
> Just to confirm, you do have a "use Apache::Scoreboard" in there somewhere?
>

surely I used it.


right now I got these exceptions in error_log:

[Thu Dec 13 21:53:49 2007] [notice] child pid 4660 exit signal
Segmentation fault (11)
[Thu Dec 13 21:53:49 2007] [notice] child pid 14182 exit signal
Segmentation fault (11)
[Thu Dec 13 21:53:49 2007] [notice] child pid 14884 exit signal
Segmentation fault (11)
[Thu Dec 13 21:53:49 2007] [notice] child pid 14979 exit signal
Segmentation fault (11)
[Thu Dec 13 21:53:49 2007] [notice] child pid 15095 exit signal
Segmentation fault (11)
[Thu Dec 13 21:53:49 2007] [notice] child pid 15107 exit signal
Segmentation fault (11)
[Thu Dec 13 21:53:49 2007] [notice] child pid 15108 exit signal
Segmentation fault (11)
[Thu Dec 13 21:53:49 2007] [notice] child pid 15115 exit signal
Segmentation fault (11)
[Thu Dec 13 21:53:49 2007] [notice] child pid 15118 exit signal
Segmentation fault (11)

This is my full code (the key string for generating md5 is replaced
here for privacy reasons):

use strict;
use warnings;
use Socket qw(inet_aton);
use POSIX qw(strftime);
use Digest::MD5 qw(md5_hex);
use File::Basename;

use Apache::Constants qw(OK FORBIDDEN DECLINED);
use Apache::Request ();
use Apache::Scoreboard ();
use Apache qw(exit);

sub handler {

    my $r = shift;

    # We decline to handle subrequests: otherwise, a few lines down we
    # could get into an infinite loop.
    return DECLINED unless $r->is_initial_req;

#
# for ip whitelist
#
    my $ip = $r->connection->remote_ip;
    my $ip_int = ip2int($ip);
    my @passip = $r->dir_config->get('PassAuthIPs');
    my @passip_int;

    for (@passip) {
        if (/-/) {
           my ($start,$end) = split/-/;
           my $start_int = ip2int($start);
           my $end_int = ip2int($end);

           for (my $i=$start_int;$i<=$end_int;$i++) {
               push @passip_int,$i;
           }

        } else {
           push @passip_int, ip2int($_);
        }
    }

    for (@passip_int) {
        return OK if $ip_int == $_;
    }

#
# for limit-ip-conn
#
    my $ip_count = 0;
    my $limit = $r->dir_config('MaxConnPerIP') || 0;
###    my $host = $r->connection->remote_host;
    my $image = Apache::Scoreboard->image;

    for (my $parent = $image->parent; $parent; $parent = $parent->next) {
        my $server = $parent->server;
        use bytes;
        next if ($server->status =~ /^[\._SL]$/);
###        if (($ip eq $server->client) or ($host eq $server->client)) {
        if ($ip eq $server->client ) {
            $ip_count++;
        }
    }

    if ($ip_count > $limit and $limit) {
        $r->log_reason("Client exceeded connection limit.", $r->filename);
        return FORBIDDEN;
    }

#
# for anti-stolen-links
#
    my $q = Apache::Request->new($r);
    my $movieid = $q->param('mid');

    unless (defined $movieid) {
        $movieid = getmid($r->uri);
        unless (defined $movieid) {
            $r->log_error("[$ip FORBIDDEN] cat't get movieid");
            return FORBIDDEN;
        }
    }

    my $shareKey = $r->dir_config('ShareKey') || '';


    my $key = 'the private string';

    my $str = $q->param('a') || '';

    if ($str eq md5_hex($key) ){
        return OK;

    } else {
        $r->log_reason("Auth failed.", $r->filename);
        return FORBIDDEN;
    }

    return OK;
}

sub ip2int {
    my $ip = shift;
    my $nl = inet_aton($ip);
    die "wrong ip $!" unless defined $nl;

    return unpack('N',$nl);
}

sub getmid {
    my $uri = shift;
    my $path = (split/\?/,$uri)[0];
    my $file = basename($path);
    my ($mid) = $file =~ /^(\d+)\D+/;

    return $mid;
}

1;



where I'm getting wrong? please help check it.
Thanks a lot!

Reply via email to