Rationale:
Reduces attack surface on kernel devs opening the links for MITM
as HTTPS traffic is much harder to manipulate.
Deterministic algorithm:
For each file:
  If not .svg:
    For each line:
      If doesn't contain `\bxmlns\b`:
        For each link, `\bhttp://[^# \t\r\n]*(?:\w|/)`:
	  If neither `\bgnu\.org/license`, nor `\bmozilla\.org/MPL\b`:
            If both the HTTP and HTTPS versions
            return 200 OK and serve the same content:
              Replace HTTP with HTTPS.
Signed-off-by: Alexander A. Klimov <grandmaster@al2klimov.de>
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20200713124923.34282-1-grandmaster@al2klimov.de
		
	
			
		
			
				
	
	
		
			96 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: MIT
 | |
| /*
 | |
|  * Copyright (C) 2017 Oracle Corporation
 | |
|  * Authors: Hans de Goede <hdegoede@redhat.com>
 | |
|  */
 | |
| 
 | |
| #include "vbox_drv.h"
 | |
| #include "vboxvideo_vbe.h"
 | |
| #include "hgsmi_defs.h"
 | |
| 
 | |
| /* One-at-a-Time Hash from https://www.burtleburtle.net/bob/hash/doobs.html */
 | |
| static u32 hgsmi_hash_process(u32 hash, const u8 *data, int size)
 | |
| {
 | |
| 	while (size--) {
 | |
| 		hash += *data++;
 | |
| 		hash += (hash << 10);
 | |
| 		hash ^= (hash >> 6);
 | |
| 	}
 | |
| 
 | |
| 	return hash;
 | |
| }
 | |
| 
 | |
| static u32 hgsmi_hash_end(u32 hash)
 | |
| {
 | |
| 	hash += (hash << 3);
 | |
| 	hash ^= (hash >> 11);
 | |
| 	hash += (hash << 15);
 | |
| 
 | |
| 	return hash;
 | |
| }
 | |
| 
 | |
| /* Not really a checksum but that is the naming used in all vbox code */
 | |
| static u32 hgsmi_checksum(u32 offset,
 | |
| 			  const struct hgsmi_buffer_header *header,
 | |
| 			  const struct hgsmi_buffer_tail *tail)
 | |
| {
 | |
| 	u32 checksum;
 | |
| 
 | |
| 	checksum = hgsmi_hash_process(0, (u8 *)&offset, sizeof(offset));
 | |
| 	checksum = hgsmi_hash_process(checksum, (u8 *)header, sizeof(*header));
 | |
| 	/* 4 -> Do not checksum the checksum itself */
 | |
| 	checksum = hgsmi_hash_process(checksum, (u8 *)tail, 4);
 | |
| 
 | |
| 	return hgsmi_hash_end(checksum);
 | |
| }
 | |
| 
 | |
| void *hgsmi_buffer_alloc(struct gen_pool *guest_pool, size_t size,
 | |
| 			 u8 channel, u16 channel_info)
 | |
| {
 | |
| 	struct hgsmi_buffer_header *h;
 | |
| 	struct hgsmi_buffer_tail *t;
 | |
| 	size_t total_size;
 | |
| 	dma_addr_t offset;
 | |
| 
 | |
| 	total_size = size + sizeof(*h) + sizeof(*t);
 | |
| 	h = gen_pool_dma_alloc(guest_pool, total_size, &offset);
 | |
| 	if (!h)
 | |
| 		return NULL;
 | |
| 
 | |
| 	t = (struct hgsmi_buffer_tail *)((u8 *)h + sizeof(*h) + size);
 | |
| 
 | |
| 	h->flags = HGSMI_BUFFER_HEADER_F_SEQ_SINGLE;
 | |
| 	h->data_size = size;
 | |
| 	h->channel = channel;
 | |
| 	h->channel_info = channel_info;
 | |
| 	memset(&h->u.header_data, 0, sizeof(h->u.header_data));
 | |
| 
 | |
| 	t->reserved = 0;
 | |
| 	t->checksum = hgsmi_checksum(offset, h, t);
 | |
| 
 | |
| 	return (u8 *)h + sizeof(*h);
 | |
| }
 | |
| 
 | |
| void hgsmi_buffer_free(struct gen_pool *guest_pool, void *buf)
 | |
| {
 | |
| 	struct hgsmi_buffer_header *h =
 | |
| 		(struct hgsmi_buffer_header *)((u8 *)buf - sizeof(*h));
 | |
| 	size_t total_size = h->data_size + sizeof(*h) +
 | |
| 					     sizeof(struct hgsmi_buffer_tail);
 | |
| 
 | |
| 	gen_pool_free(guest_pool, (unsigned long)h, total_size);
 | |
| }
 | |
| 
 | |
| int hgsmi_buffer_submit(struct gen_pool *guest_pool, void *buf)
 | |
| {
 | |
| 	phys_addr_t offset;
 | |
| 
 | |
| 	offset = gen_pool_virt_to_phys(guest_pool, (unsigned long)buf -
 | |
| 				       sizeof(struct hgsmi_buffer_header));
 | |
| 	outl(offset, VGA_PORT_HGSMI_GUEST);
 | |
| 	/* Make the compiler aware that the host has changed memory. */
 | |
| 	mb();
 | |
| 
 | |
| 	return 0;
 | |
| }
 |